15829 Hashing

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

10월 14일

기본적인 해싱 문제이다. 해싱보다는 아래 조건 변환하는 방법만 살펴본다.

먼저, 편의상 입력으로 들어오는 문자열에는 영문 소문자(a, b, …, z)로만 구성되어있다고 가정하자. 영어에는 총 26개의 알파벳이 존재하므로 a에는 1, b에는 2, c에는 3, …, z에는 26으로 고유한 번호를 부여할 수 있다. 결과적으로 우리는 하나의 문자열을 수열로 변환할 수 있다. 예를 들어서 문자열 “abba”은 수열 1, 2, 2, 1로 나타낼 수 있다.

C 였으면 c - 'A' 했을 텐데 파이썬에서는 처음 본다.

스택오버플로우에 답이 있다. 참고한 링크

L = int(input())
str =  input()

# string을 char 단위로 나누고
# 각 문자를 list의 원소로 저장.
# list()의 인자로 문자열을 넣으면 자동으로 해준다.
list = list(str)

# 각 char를 숫자로 변환. 
# 순회하며 각 문자에 ord 적용
list2 = []
for char in list:
    num = ord(char) - 96
    list2.append(num)

참고사항

전체 코드

# 15829 Hashing

M = 1234567891
r = 31


L = int(input())
str =  input()

# string을 char 단위로 나누고
# 각 문자를 list의 원소로 저장. 
list = list(str)

# 각 char를 숫자로 변환. 

# raw_input 입력받은 결과에 상관없이 무조건 string으로 간주
# raw_input은 python 3에서 삭제되었음
# 대신 str으로 직접 변환

list2 = []

# 순회하며 각 문자에 ord 적용
for char in list:
    num = ord(char) - 96
    list2.append(num)


# 그다음 해시 적용

for i in range(len(list2)):
    list2[i] = list2[i] * (r ** i)

sum = sum(list2)
H = sum % M

print(H)