15829번: Hashing
APC에 온 것을 환영한다. 만약 여러분이 학교에서 자료구조를 수강했다면 해시 함수에 대해 배웠을 것이다. 해시 함수란 임의의 길이의 입력을 받아서 고정된 길이의 출력을 내보내는 함수로 정
www.acmicpc.net
문제상황
해시란, 임의의 길이를 가진 데이터를 입력받아 고정된 길이인
해시 값을 출력하는 함수이다. 주로, 데이터 암호화에서 해시를 사용한다.
그럼, 해시 값을 만들기 위해, 특정한 해시 함수가 존재한다.
(임의의 값에 대해 중복된 해시 값을 지니고 있을 때,
해시 충돌이 있다고 말한다.)
해당 상황에선, 임의의 입력 데이터를 "소문자 알파벳 문자열"로 한정했고,
그에 따른 해시 함수 (hash function)을 제공했다.
입력으론, 문자열의 길이와 문자열이 주어지고,
주어진 문자열에 대한 해시 값을 찾아내는 것이 문제였다.
즉, 주어진 문자열인 "소문자 알파벳 문자열"에 대해서
문제에서 주어진 해시 함수로 해시 값을 출력하면 된다.
솔루션
입력으로 들어오는 문자열인 "소문자 알파벳 문자"들을
고유한 형태인 a = 1, b = 2, c = 3 . . . z = 26 으로 인덱싱하고자
ord() 함수를 활용해 소문자 알파벳의 아스키코드 값 (정수 값) 을 얻었다.
print(ord("a"))
# 숫자 97 출력
그렇게, 얻은 아스키 코드 값으로
각각의 소문자 알파벳 문자를 정수 값(문제에서 주어진 인덱스 값)으로 인덱싱을 했다.
이때, 아스키코드는 모든 문자들이 고유한 10진수 값으로 지니고 있다는 사실을 이해하고, 진행한 솔루션이다.
솔루션 코드 작성
# 백준 해싱
# print(ord("a") - 96)
# 아스키코드로 문제 해결
l = int(input()) # 문자열 길이 입력
char_list = input() # 문자열 입력
# 해시 값 초기화
answer_hashing = 0
# 해시함수 실행
for i in range(l):
answer_hashing += (ord(char_list[i]) - 96 ) * 31**i
answer_hashing = answer_hashing % 1234567891
print(answer_hashing)
마치며
자료구조를 알고있음으로, 쉽게 해결할 수 있었던 문제이다.
문제 상황에서 필요한 자료구조를 이해함으로써,
단순하게 솔루션을 마련할 수 있었다.
이번 문제 풀이를 통해
"자료구조"를 숙지하고 문제 상황에서 사용되는 알고리즘에 적용한다면
간단한 로직으로 구현해낼 수 있다는 것을 다시금 깨닫게 되었다.
(만약, 아스키코드를 몰랐다면
복잡한 논리로 각 문자들을 인덱싱하는 함수를 구현해야 되었을 것이다.)
정리해서, 이번 문제는 자료구조를 배워야하는 이유를 내게 전달해준 뜻깊은 문제였다.
'📚 스터디 > 알고리즘' 카테고리의 다른 글
[백준 2609번] 최대공약수와 최소공배수 (0) | 2023.07.13 |
---|---|
[백준 1259번] 팰린드롬수 (6) | 2023.07.11 |
[백준 2798번] 블랙잭 (0) | 2023.07.09 |
[백준 2331번] 분해합 (0) | 2023.07.09 |
[백준 1978번] 소수 찾기 (0) | 2023.07.08 |