문제
해시 함수란 임의의 길이의 데이터를 받아 고정된 길이의 데이터로 가공하여 내보내는 함수이다. 이러한 해시 함수는 주로 자료의 저장과 탐색에 사용된다.
영문 소문자(a, b, ..., z)로만 구성된 문자열
해시 값을 계산하기 위해 문자열을 하나의 정수로 치환하고자 한다. 이를 위해 문자열을 수열로 변경하고, 이 변경된 수열의 값을 모두 더한다. 고정된 길이의 데이터로 가공하여야 하기에
해시 함수의 입력으로 들어올 수 있는 문자열의 종류는 무한하지만 데이터의 길이는 제한되어 있기에 비둘기 집의 원리에 의하여 서로 다른 문자열이더라도 동일한 해시 값을 가질 수 있다. 이를 해시 충돌이라고 하는데, 좋은 해시 함수는 최대한 충돌이 적게 일어나야 한다. 위에서 정의한 해시 함수는 알파벳의 순서만 바꿔도 충돌이 일어나기 때문에 나쁜 해시 함수이다. 이에 개선책을 생각해보자.
수열의 각 항마다 고유한 계수를 부여하면 순서가 달라졌을때 해시 함수의 결과가 달라진다. 그럼 특정한 숫자
보통
입력으로 주어진 문자열의 해시 값을 위 식을 이용하여 계산하는 프로그램을 작성하자.
입력
첫 줄에 문자열의 길이
출력
위 식으로 이루어진 해시 함수를 이용하여 문자열
부분문제
| 번호 | 점수 | 조건 |
|---|---|---|
| #1 | 30점 | |
| #2 | 70점 | 추가 제한 없음 |
예제 #1
5 abbca
1014879
예제 #2
3 aaa
993