๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

[Java] BOJ 15829 Hashing

by ๐ŸŠ๊ทค๐ŸŠ 2024. 7. 11.

๋ฌธ์ œ 

๋ฌธ์ œ ๋งํฌ https://www.acmicpc.net/problem/15829

  • r์˜ ๊ฐ’์€ 26๋ณด๋‹ค ํฐ ์†Œ์ˆ˜์ธ 31๋กœ ํ•˜๊ณ  M์˜ ๊ฐ’์€ 1234567891๋กœ ํ•œ๋‹ค.
  • ์œ„ ์‹์„ ํ†ตํ•ด ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์˜ ํ•ด์‹œ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜์‹œ์˜ค.
  • ์ฒซ ์ค„์—๋Š” ๋ฌธ์ž์—ด์˜ ๊ธธ์ด L์ด ๋“ค์–ด์˜จ๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์˜๋ฌธ ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด์ด ๋“ค์–ด์˜จ๋‹ค.
  • ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๋ฌธ์ž์—ด์€ ๋ชจ๋‘ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ๋งŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.
  • ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ํ•ด์‹œํ•จ์ˆ˜์™€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•ด ๊ณ„์‚ฐํ•œ ํ•ด์‹œ ๊ฐ’์„ ์ •์ˆ˜๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

์•„์ด๋””์–ด

  • ์˜์–ด์˜ ์†Œ๋ฌธ์ž๋ฅผ ์•„์Šคํ‚ค์ฝ”๋“œ๋กœ ๋ณ€ํ™˜์‹œ์ผœ ํ•ด๋‹น ์•„์Šคํ‚ค์ฝ”๋“œ์— ํ•ด์‹œ ๊ฐ’์„ ๋งค์นญ์‹œ์ผœ์„œ ์•„์Šคํ‚ค์ฝ”๋“œ๋ฅผ key๊ฐ’, ํ•ด์‹œ ๊ฐ’์„ value๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” HashMap์„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. 

๊ฒช์€ ์‹œํ–‰์ฐฉ์˜ค

  • ์ฒ˜์Œ์— 50์ ์ด ๋‚˜์™”๋‹ค... ๋จธ๊ฐ€ ๋ฌธ์ œ์ธ๊ฐ€ ํ–ˆ๋”๋‹ˆ ๋ฌธ์ž์—ด ๊ธธ์ด๊ฐ€ ์ปค์งˆ์ˆ˜๋ก 31์˜ ์ œ๊ณฑ์ˆ˜๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ปค์ ธ์„œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ์ƒ๊ฒจ ๋‚˜๋จธ์ง€ 50์ ์„ ๋ชป๋ฐ›์€๊ฑฐ์˜€๋‹ค. 
  • ๊ทธ๋ž˜์„œ ์ฒ˜์Œ์—๋Š” Math.pow๋ฅผ ์จ์„œ ์ œ๊ณฑ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ–ˆ์ง€๋งŒ for๋ฌธ์„ ํ†ตํ•ด 31์„ ์ผ์ผ์ด ๊ณฑํ•ด์ฃผ๋ฉด์„œ 1234567891์„ ๋‚˜๋ˆ  ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ–ˆ๋‹ค. 
  • ๋‹ค์Œ๋ถ€ํ„ฐ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋„ ์ƒ๊ฐํ•˜๊ธฐ..! ๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ๋„ ์กฐ๊ธˆ ๋” ๊ผผ๊ผผํžˆ ์ฝ๊ธฐ.. (์ฒ˜์Œ์— 1234567891 ๋‚˜๋ˆ„๋Š”๊ฑธ ๋นผ๋จน์—ˆ๋‹ค..ใ…Ž)

๋ฌธ์ œ๋ฅผ ์ข€ ๋” ๊ผผ๊ผผํžˆ ํ’€์ž!

์ฝ”๋“œ

import java.io.*;
import java.util.*;

public class BOJ15829 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());

        String s = br.readLine();

        // ํ•ด์‹œ ๊ฐ’ ์ €์žฅํ•  ๋ฐฐ์—ด
        HashMap<Integer, Integer> hash = new HashMap<Integer, Integer>(26);

        int cnt = 1;
        // ์†Œ๋ฌธ์ž ์•„์Šคํ‚ค์ฝ”๋“œ๊ฐ€ 97 ~ 122
        // ์•„์Šคํ‚ค์ฝ”๋“œ๋งˆ๋‹ค ํ•ด์‹œํ•จ์ˆ˜ ๊ฐ’ ์ €์žฅ
        for(int i = 97; i <= 122; i++){
            hash.put(i, cnt);
            cnt = cnt + 1;
        }

        int hash_cnt = 0;
        long result = 0;

        for(int i = 0; i < s.length(); i++){
            // i๋ฒˆ์งธ ๋ฌธ์ž๋ฅผ ์•„์Šคํ‚ค์ฝ”๋“œ๋กœ ๋ณ€ํ™˜
            int c = (int)s.charAt(i);

            // ๋ณ€ํ™˜ํ•œ ์•„์Šคํ‚ค์ฝ”๋“œ๋ฅผ key ๊ฐ’์œผ๋กœ ํ•ด๋‹น ํ•ด์‹œ ๊ฐ’์ธ value๋ฅผ ์ฐพ์Œ
            int h = hash.get(c);

            long po = 1;
            // ํ•ด์‹œ ๊ฐ’ * 31^(์ˆซ์ž ํ•ด๋‹น ์ˆœ๋ฒˆ(0๋ถ€ํ„ฐ ์‹œ์ž‘)
            for(int j = 0; j < hash_cnt; j++){
                // 31์„ ๊ณ„์† ๊ณฑํ•ด์ค€ ํ›„, ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋‚˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด
                // 1234567891๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€
                po = (po * 31) % 1234567891;
            }

            // ๋‚˜์˜จ 31 ์ œ๊ณฑ๊ฐ’๊ณผ ํ•ด์‹œ ๊ฐ’์„ ๊ณฑํ•ด์คŒ
            po = h * po;

            // ๋”ํ•œ์ˆ˜๋„ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ 1234567891๋กœ ๋‚˜๋ˆ ์คŒ
            result = (result + po) % 1234567891;

            // ์ˆซ์ž ์ˆœ๋ฒˆ + 1
            hash_cnt = hash_cnt + 1;
        }

        System.out.println(result);
    }
}



'์•Œ๊ณ ๋ฆฌ์ฆ˜' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Java] BOJ 1546 ํ‰๊ท   (2) 2024.07.11
[Java] BOJ 1259 ํŒฐ๋ฆฐ๋“œ๋กฌ์ˆ˜  (0) 2024.07.11
[Java] BOJ 2798 ๋ธ”๋ž™์žญ  (0) 2024.07.10
[Java] BOJ 2292 ๋ฒŒ์ง‘  (0) 2024.07.10
[Java] BOJ 2231 ๋ถ„ํ•ดํ•ฉ  (0) 2024.07.10