매일 BOJ

(매일 BOJ) Python 15829번 해싱

norepinephrine 2025. 3. 30. 22:49

🔍 문제 요약

문자열이 주어졌을 때, 다음과 같은 해시 함수를 사용하여 문자열의 해시 값을 계산합니다:

공식:
H=∑i=0l−1(ai×ri)mod  MH = \sum_{i=0}^{l-1} (a_i \times r^i) \mod M

  • ll: 문자열의 길이
  • aia_i: i번째 문자의 아스키 코드 값을 숫자로 변환한 값 (예: 'a'는 1, 'b'는 2, ..., 'z'는 26)
  • rr: 31
  • MM: 1234567891

🧮 입력

  • 첫째 줄: 문자열의 길이 ll (1 ≤ ll ≤ 50)
  • 둘째 줄: 문자열 (소문자 a~z)

✅ 출력

  • 해시 값을 출력

1차 코드 / 50점

result = result % 1234567891

를 빼먹었다.

num = int(input())
abc = list('abcdefghijklmnopqrstuvwxyz')
text = list(input())
result = 0
buffer = 0
for i in range(num):
    for o in range(len(abc)):
        if text[i] == abc[o]:
            buffer = o+1
    result += buffer*31**i
print(result)

 

2차 코드

num = int(input())
abc = list('abcdefghijklmnopqrstuvwxyz')
text = list(input())
result = 0
buffer = 0
for i in range(num):
    for o in range(len(abc)):
        if text[i] == abc[o]:
            buffer = o+1
    result += buffer*31**i
result = result % 1234567891
print(result)

 

그리고 이와같이 개선할 수 있다.

 

 

  • 기존 방식:
  • for o in range(len(abc)):
        if text[i] == abc[o]:
            buffer = o + 1

 

  • 개선 방식:
  • buffer = ord(text[i]) - ord('a') + 1