본문 바로가기

PS

[BOJ] 15829번 : Hashing

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

 

15829번: Hashing

APC에 온 것을 환영한다. 만약 여러분이 학교에서 자료구조를 수강했다면 해시 함수에 대해 배웠을 것이다. 해시 함수란 임의의 길이의 입력을 받아서 고정된 길이의 출력을 내보내는 함수로 정

www.acmicpc.net

 

 

문제 파악

1. 문자열의 길이가 주어지고 해당 길이를 만족하는 문자열이 주어진다.

2. 문제 설명에 나와있듯이 r의 값은 26보다 큰 소수인 31, M의 값은 1234567891로 정해져 있다.

3. 인덱스 위치 0부터 L-1까지 차수를 증가시키면서 ((해당 인덱스의 문자) - 'a' +1) * (31)^(인덱스) 값을 M으로 나눈 나머지를 구한다.

 

JAVA에는 BigInteger class가 있어서 BigInteger로써 문제를 해결하였다.

 

더보기
import java.io.*;
import java.math.BigInteger;

public class Main {
    static BigInteger rem = BigInteger.valueOf(1234567891);
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int len = Integer.parseInt(br.readLine());
        String str = br.readLine();

        BigInteger bigInteger = BigInteger.ZERO;

        int L = 0;

        for(int idx=0;idx<len;idx++)
        {
            int num = str.charAt(idx) -'a'+1;
            BigInteger result =getHashCode(num,L);

            bigInteger = bigInteger.add(result).remainder(rem);
            L++;
        }
        
        System.out.println(bigInteger);
    }

    private static BigInteger getHashCode(int num, int idx) {

        BigInteger exp = BigInteger.valueOf(31).pow(idx);

        BigInteger multiply = BigInteger.valueOf(num).multiply(exp).remainder(rem);

        return multiply;
    }
}

 

'PS' 카테고리의 다른 글

[BOJ]4358번 : 생태학  (0) 2021.08.08
[BOJ]17219번 : 비밀번호 찾기  (0) 2021.07.27
[Programmers] LV2 - 소수 찾기  (0) 2021.07.20
[Programmers] LV2 - 가장 큰 정사각형 찾기  (0) 2021.07.17
[Programmers] LV2 - 배달  (0) 2021.07.15