문제
- 문자열 길이와 문자들이 주어질 때, 주어진 해시 함수를 이용해 계산한 해시 값을 정수로 출력하는 문제.
아이디어
- 주어진 그대로 구현한다.
- L이 50을 넘어가면 31^51 이라는 어마무시한 크기의 숫자가 나오므로 매번 M 값으로 나누어 준다.
- 혹시라도 발생할 오버플로우를 방지하기 위해 연산에 사용되는 tmp 변수를 long 타입으로 지정한다.
풀이
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int r = 31;
int M = 1_234_567_891;
int L = Integer.parseInt(br.readLine());
String str = br.readLine();
long hash = 0;
for(int i=0; i<L; i++) {
long tmp = str.charAt(i)-96;
for(int j=0; j<i; j++) {
tmp *= r;
tmp %= M;
}
hash += tmp;
hash %= M;
}
System.out.println(hash);
}
}
채점 결과
기타
- 기본적인 롤링 함수라고 하니 잘 숙지해둬야겠다.
문제 링크
'백준' 카테고리의 다른 글
[JAVA] 백준 1546번: 평균 (0) | 2024.07.11 |
---|---|
[JAVA] 백준 1259번: 팰린드롬수 (1) | 2024.07.11 |
[JAVA] 백준 2798번: 블랙잭 (1) | 2024.07.10 |
[JAVA] 백준 2292번: 벌집 (0) | 2024.07.10 |
[JAVA] 백준 2231번: 분해합 (0) | 2024.07.10 |