๋ฐ˜์‘ํ˜•
Notice
Recent Posts
Recent Comments
Link
ยซ   2025/03   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Archives
Today
Total
03-11 02:22
๊ด€๋ฆฌ ๋ฉ”๋‰ด

ImJay

[BOJ/Java] 10942. ํŒฐ๋ฆฐ๋“œ๋กฌ? ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜/BOJ - Java

[BOJ/Java] 10942. ํŒฐ๋ฆฐ๋“œ๋กฌ?

ImJay 2025. 3. 10. 09:47
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ [BOJ/Java] 10942. ํŒฐ๋ฆฐ๋“œ๋กฌ?

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ: ๋ฐฑ์ค€ 10942๋ฒˆ - ํŒฐ๋ฆฐ๋“œ๋กฌ?


๐Ÿ“– ๋ฌธ์ œ ํ•ด์„

๐Ÿ”ข ์ฃผ์–ด์ง„ ์ˆ˜์—ด์—์„œ ํŠน์ • ๊ตฌ๊ฐ„์ด ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ์ง€ ํŒ๋ณ„ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
๐Ÿ› ๏ธ ํŒฐ๋ฆฐ๋“œ๋กฌ(Palindrome): ์•ž์—์„œ ์ฝ์–ด๋„ ๋’ค์—์„œ ์ฝ์–ด๋„ ๊ฐ™์€ ๋ฌธ์ž์—ด or ์ˆ˜์—ด
โ“ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์งˆ๋ฌธ(๊ตฌ๊ฐ„)์ด ์ฃผ์–ด์ง€๋ฉฐ, ๊ฐ ๊ตฌ๊ฐ„์ด ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ์ง€ ๋น ๋ฅด๊ฒŒ ํŒ๋‹จํ•ด์•ผ ํ•œ๋‹ค.

โœ… ํ•ต์‹ฌ ๊ฐœ๋…

  • ๋‹จ์ˆœํ•˜๊ฒŒ ๋งค๋ฒˆ ํ™•์ธํ•˜๋ฉด O(N) ์—ฐ์‚ฐ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๋น„ํšจ์œจ์ 
  • DP(๋™์  ๊ณ„ํš๋ฒ•) ํ™œ์šฉํ•˜์—ฌ ์ค‘๋ณต ๊ณ„์‚ฐ ์ตœ์†Œํ™”
  • ๊ตฌ๊ฐ„ ํŒ๋ณ„ ๋ฌธ์ œ์ด๋ฏ€๋กœ "๊ตฌ๊ฐ„ DP"๋กœ ์ ‘๊ทผ

๐Ÿ› ๏ธ ํ’€์ด ๊ณผ์ •

1๏ธโƒฃ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ๋ฐ ์ดˆ๊ธฐํ™”

  • N๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๋ฐฐ์—ด์— ์ €์žฅ
  • dp[i][j]๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ i๋ถ€ํ„ฐ j๊นŒ์ง€์˜ ๊ตฌ๊ฐ„์ด ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ์ง€ ์ €์žฅ

2๏ธโƒฃ DP ํ…Œ์ด๋ธ” ์ฑ„์šฐ๊ธฐ

  • dp[i][i] = true (๊ธธ์ด 1์งœ๋ฆฌ ๊ตฌ๊ฐ„์€ ํ•ญ์ƒ ํŒฐ๋ฆฐ๋“œ๋กฌ)
  • dp[i][i+1] = (arr[i] == arr[i+1]) (๊ธธ์ด 2์งœ๋ฆฌ ๊ตฌ๊ฐ„์€ ๋‘ ์ˆซ์ž๊ฐ€ ๊ฐ™์œผ๋ฉด ํŒฐ๋ฆฐ๋“œ๋กฌ)
  • ๊ธธ์ด๊ฐ€ 3 ์ด์ƒ์ผ ๋•Œ:
    dp[i][j] = (arr[i] == arr[j]) && dp[i+1][j-1]

3๏ธโƒฃ ์งˆ๋ฌธ์— ๋น ๋ฅด๊ฒŒ ๋‹ตํ•˜๊ธฐ

  • dp[s][e] ๊ฐ’์„ ๋ฐ”๋กœ ์ถœ๋ ฅํ•˜์—ฌ O(1) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ํŒ๋ณ„

๐Ÿ’ป ์ฝ”๋“œ ๊ตฌํ˜„ (Java)

import java.util.*;

public class Main {
    static int N, M;
    static int[] arr;
    static boolean[][] dp;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        N = sc.nextInt();
        arr = new int[N + 1]; // 1-based index
        dp = new boolean[N + 1][N + 1];

        for (int i = 1; i <= N; i++) {
            arr[i] = sc.nextInt();
        }

        preprocess(); // DP ํ…Œ์ด๋ธ” ๋ฏธ๋ฆฌ ์ฑ„์šฐ๊ธฐ

        M = sc.nextInt();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < M; i++) {
            int s = sc.nextInt();
            int e = sc.nextInt();
            sb.append(dp[s][e] ? "1\n" : "0\n");
        }

        System.out.print(sb);
    }

    public static void preprocess() {
        // ๊ธธ์ด 1์ธ ๊ตฌ๊ฐ„ (ํ•ญ์ƒ ํŒฐ๋ฆฐ๋“œ๋กฌ)
        for (int i = 1; i <= N; i++) {
            dp[i][i] = true;
        }

        // ๊ธธ์ด 2์ธ ๊ตฌ๊ฐ„
        for (int i = 1; i < N; i++) {
            if (arr[i] == arr[i + 1]) {
                dp[i][i + 1] = true;
            }
        }

        // ๊ธธ์ด 3 ์ด์ƒ์ธ ๊ตฌ๊ฐ„
        for (int len = 3; len <= N; len++) { // ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ๊ธธ์ด
            for (int i = 1; i + len - 1 <= N; i++) { // ์‹œ์ž‘ ์ธ๋ฑ์Šค
                int j = i + len - 1; // ๋ ์ธ๋ฑ์Šค
                if (arr[i] == arr[j] && dp[i + 1][j - 1]) {
                    dp[i][j] = true;
                }
            }
        }
    }
}

โฑ๏ธ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

๐Ÿ“Œ O(N² + M) (์ตœ๋Œ€ 2500² + 10โถ ≈ 625๋งŒ ์—ฐ์‚ฐ)
๐Ÿ’ก DP ํ…Œ์ด๋ธ” ์ฑ„์šฐ๊ธฐ → O(N²)
๐Ÿ’ก ๊ฐ ์งˆ์˜ ์ฒ˜๋ฆฌ → O(1) (์ด O(M))
๐Ÿ”ฅ N ≤ 2000์ด๋ฏ€๋กœ ์ถฉ๋ถ„ํžˆ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ


๐Ÿ’ก ๋Š๋‚€์ 

โœ… ๊ตฌ๊ฐ„ DP๋ฅผ ํ™œ์šฉํ•˜๋Š” ์ข‹์€ ๋ฌธ์ œ
โœ… ๋งค๋ฒˆ ์ง์ ‘ ํŒฐ๋ฆฐ๋“œ๋กฌ์„ ๊ฒ€์‚ฌํ•˜๋ฉด O(N)์”ฉ ๊ฑธ๋ฆฌ์ง€๋งŒ, DP๋ฅผ ์ด์šฉํ•ด O(1)๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
โœ… ๋ฌธ์ž์—ด์ด๋‚˜ ์ˆ˜์—ด์˜ "๊ตฌ๊ฐ„ ๋ฌธ์ œ"๋Š” DP ํ™œ์šฉ ๊ฐ€๋Šฅ์„ฑ์„ ํ•ญ์ƒ ๊ณ ๋ฏผํ•ด๋ด์•ผ ํ•œ๋‹ค! ๐Ÿš€

๋ฐ˜์‘ํ˜•
Comments