알고리즘/백준
[백준] 15829번 - Hashing
땀두
2022. 3. 19. 23:08


import java.util.Scanner;
public class p15829 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
String s = sc.next();
int sum = 0;
for (int i = 0; i < s.length(); i++) {
sum += (int) (s.charAt(i) - 96) * Math.pow(31, i);
}
sum = sum % 1234567891;
System.out.println(sum);
}
}
이렇게 문제를 풀어보니 50점짜리 답안이라고 채점결과가 나왔다.
그래서 L < 50 인 케이스를 해결하기 위해서 출력을 하다보니 일정 수준이 넘어가다보면 숫자가 오버플로우 나서 음수값으로 표시됨을 알게 되었다.
그래서 연산을 하면서 sum과 pow연산을 하는 변수를 따로 두어 이 값들을 반복을 하면서 같은 모듈러 값으로 연산해주는 부분을 추가하여 제대로된 답을 구할 수 있게 되었다.
import java.util.Scanner;
public class p15829 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
String s = sc.next();
long mod = 1234567891;
long b = 1;
long sum = 0;
for (int i = 0; i < s.length(); i++) {
long k = ((s.charAt(i) - 96) * b) % mod;
sum += k;
sum = sum % mod;
b *= 31;
b = b % mod;
}
System.out.println(sum);
}
}