Growth & Practice/코딩테스트

[python] 15829. Hashing

foreverWon 2024. 10. 27. 15:44
목차

    1. 문제

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

     

    2. 해결

    try1) 런타임 에러 

    # 입력
    len = int(input())
    userList = input()
    
    M = 1234567891
    R = 31
    
    # ord('a') = 97 이용하여 알파벳에 고유한 계수 부여 (1~26)
    arrList = []
    for a in userList:
        arrList.append(ord(a) - 96)
    
    # 해시 값 계산
    hashResult = 0
    for l in range(len):
        hashResult += int(arrList[l]) * (R ** l)
    
    print(hashResult % M)

    굳이 모든 알파벳에 고유한 계수를 부여할 필요가 없었다.

    입력된 알파벳에 대해서만 계산했어도 충분하니까!

    try2)

    # 입력
    len = int(input())
    userList = input()
    
    M = 1234567891
    R = 31
    
    # ord('a') = 97 이용하여 알파벳에 고유한 계수 부여 (1~26)
    hashResult = 0
    for i in range(len):
        num = ord(userList[i]) - 96
        hashResult += num * (R ** i)
    
    print(hashResult % M)

     

    3. check point

    1) 문제 이해

    • 입력된 문자에 대해 각각 고유한 계수 부여
      • ord('a') = 97을 이용해서 각 문자에 1부터 26까지 값을 부여하려면 각 아스키코드 값에서 96을 빼주면 된다.
    • 문제에서 알려준 hash값 구하는 계산식에 집어넣으면 된다.
      • 제곱은 ** 이용
      • mod는 나머지 연산자

    2) ord()

    처음에 고유한 계수...? 어떻게 하냐.. 하면서 막막했는데 갑자기 전에 공부한 아스키코드가 떠올랐다.

    ord('a) = 97 외우자!!

    728x90