[Python]BaekJoon.AC

[Python]백준 BaekJoon.AC 15829 : Hashing(ord(), 아스키코드)

스뇨잉 2022. 1. 6. 18:41
728x90
728x90

 

https://www.acmicpc.net/problem/15829

 

15829번: Hashing

APC에 온 것을 환영한다. 만약 여러분이 학교에서 자료구조를 수강했다면 해시 함수에 대해 배웠을 것이다. 해시 함수란 임의의 길이의 입력을 받아서 고정된 길이의 출력을 내보내는 함수로 정

www.acmicpc.net

 

 

모듈러 개념을 제대로 몰라 힘들었던 기억이 있는 문제다. 며칠을 끙끙대며 풀었는데..

요번엔 곧잘 풀어내서 그래도 실력이 조금은 늘었나 싶다.

장황하게 설명을 해뒀지만 결국 아래식을 코드로 구현해내란 뜻이다.

 

우선 소문자 알파벳을 리스트로 받아줬다.

for문을 이용해 이 리스트들을 하나씩 꺼내 아스키코드로 변환해주고, 96을 빼 1부터 26까지의 숫자로 만들어준다.

(a의 아스키코드가 97이기 때문이다. 이후 1씩 증가)

이렇게 구한 값이

다.

 

이걸 r의 i제곱과 곱해준다. 이 과정을 for문에 넣어뒀기 때문에 리스트 모든 값을 이런식으로 처리해주고, 모두 더해준다.

r과 M은 정해줬으니 대입만 해주면 된다.

각 리스트 결과값마다 M으로 나눈 나머지를 result에 넣은 이유는 숫자를 너무 크게 만들지 않기 위해서다.

모듈러 연산 법칙에 의거했다.

 

 

 

L = int(input())
apb = list(input())
M = 1234567891
result = 0

for i in range(L):
    a = ord(apb[i])-96
    r = 31 ** i
    result = result + a * r % M

print(result % M)

 

 

728x90
728x90