๐Ÿ“– [๋ฐฑ์ค€์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด] Q.10942 ํŒฐ๋ฆฐ๋“œ๋กฌ? ๋ฌธ์ œ ํ’€์ด - java

๐Ÿ“– ๋ฌธ์ œ

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

๋ช…์šฐ๋Š” ํ™์ค€์ด์™€ ํ•จ๊ป˜ ํŒฐ๋ฆฐ๋“œ๋กฌ ๋†€์ด๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๋จผ์ €, ํ™์ค€์ด๋Š” ์ž์—ฐ์ˆ˜ N๊ฐœ๋ฅผ ์น ํŒ์— ์ ๋Š”๋‹ค. ๊ทธ ๋‹ค์Œ, ๋ช…์šฐ์—๊ฒŒ ์งˆ๋ฌธ์„ ์ด M๋ฒˆ ํ•œ๋‹ค.

๊ฐ ์งˆ๋ฌธ์€ ๋‘ ์ •์ˆ˜ S์™€ E(1 โ‰ค S โ‰ค E โ‰ค N)๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, S๋ฒˆ์งธ ์ˆ˜๋ถ€ํ„ฐ E๋ฒˆ์งธ ๊นŒ์ง€ ์ˆ˜๊ฐ€ ํŒฐ๋ฆฐ๋“œ๋กฌ์„ ์ด๋ฃจ๋Š”์ง€๋ฅผ ๋ฌผ์–ด๋ณด๋ฉฐ,

๋ช…์šฐ๋Š” ๊ฐ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค ๋˜๋Š” ์•„๋‹ˆ๋‹ค๋ฅผ ๋งํ•ด์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ™์ค€์ด๊ฐ€ ์น ํŒ์— ์ ์€ ์ˆ˜๊ฐ€ 1, 2, 1, 3, 1, 2, 1๋ผ๊ณ  ํ•˜์ž.

S = 1, E = 3์ธ ๊ฒฝ์šฐ 1, 2, 1์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค. S = 2, E = 5์ธ ๊ฒฝ์šฐ 2, 1, 3, 1์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด ์•„๋‹ˆ๋‹ค. S = 3, E = 3์ธ ๊ฒฝ์šฐ 1์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค. S = 5, E = 7์ธ ๊ฒฝ์šฐ 1, 2, 1์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค. ์ž์—ฐ์ˆ˜ N๊ฐœ์™€ ์งˆ๋ฌธ M๊ฐœ๊ฐ€ ๋ชจ๋‘ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ช…์šฐ์˜ ๋Œ€๋‹ต์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

๐Ÿ” ์ ‘๊ทผ๋ฒ•

Q.10942 ํŒฐ๋ฆฐ๋“œ๋กฌ? ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ž์—ฐ์ˆ˜ N๊ฐœ๊ฐ€ ์ฃผ์–ด์ง€๊ณ 

M๋ฒˆ์˜ ์งˆ๋ฌธ์ด ์ฃผ์–ด์ง€๋Š”๋ฐ

๊ฐ ์งˆ๋ฌธ๋งˆ๋‹ค S๋ถ€ํ„ฐ E๊นŒ์ง€์˜ ์ˆ˜๊ฐ€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ํŒฐ๋ฆฐ๋“œ๋กฌ์˜ ํŠน์„ฑ์„ ์ด์šฉํ•ด

๋ฌธ์ž์—ด์˜ substring์„ ์ด์šฉํ•ด S๋ถ€ํ„ฐ E๊นŒ์ง€์˜ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ ํ›„

reverse ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ํ’€์ดํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ฃผ์–ด์ง„ ์งˆ๋ฌธ์˜ ๊ฐœ์ˆ˜ M์ด ๋„ˆ๋ฌด ๋งŽ์•„ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹ค์Œ์€ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ด์šฉํ•ด ํ’€์ดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํŒฐ๋ฆฐ๋“œ๋กฌ์€ S๋ถ€ํ„ฐ E๊นŒ์ง€์˜ ์ˆ˜๊ฐ€ ๋Œ€์นญ์ด ๋˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ S <-> E ์‚ฌ์ด์˜ ์ˆซ์ž๋“ค์ด ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๊ณ  S๋ฒˆ์งธ ์ˆ˜ E๋ฒˆ์งธ ์ˆ˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด ํŒฐ๋ฆฐ๋“œ๋กฌ์ž…๋‹ˆ๋‹ค.

์ฆ‰ S+1๋ฒˆ์งธ๋ถ€ํ„ฐ E-1๋ฒˆ์งธ ์ˆ˜๋“ค์ด ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๊ณ  S๋ฒˆ์งธ ์ˆ˜ E๋ฒˆ์งธ ์ˆ˜๊ฐ€ ๊ฐ™์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

if (dp[i+1][j-1] == 1 && numbers[i]==numbers[j]) true => ํŒฐ๋ฆฐ๋“œ๋กฌ 

์œ„์˜ ๊ทœ์น™์„ ์ด์šฉํ•˜๋ฉด ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋‹จ, S์™€ E๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์ฆ‰ ๊ธธ์ด๊ฐ€ 1์ธ ๊ฒฝ์šฐ์—๋Š” ๋ฌด์กฐ๊ฑด ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋ฏ€๋กœ ๋จผ์ € ํŒฐ๋ฆฐ๋“œ๋กฌ์ž„์„ ํ‘œ์‹œํ•ด์ฃผ๊ณ 

S๋ถ€ํ„ฐ E์˜ ๊ธธ์ด๊ฐ€ 2์ผ ๋•Œ๋Š” S๋ฒˆ์งธ ์ˆ˜์™€ E๋ฒˆ์งธ ์ˆ˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด ํŒฐ๋ฆฐ๋“œ๋กฌ์ž„์„ ํ‘œ์‹œํ•ด์ค๋‹ˆ๋‹ค.

๊ทธ ์ดํ›„

๊ธธ์ด๊ฐ€ 3์ธ ๊ฒฝ์šฐ๋ถ€ํ„ฐ ์œ„์˜ ๊ทœ์น™์„ ์ด์šฉํ•ด

๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ป ์ฝ”๋“œ

1. String reverse๋ฅผ ์ด์šฉํ•œ ํ’€์ด (์‹œ๊ฐ„์ดˆ๊ณผ)

package problem.dynamic.Q10942;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main_10942_1 {

    static String palindrome;
    static int n,m;
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        input();
        System.out.println(sb.toString());
    }

    private static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        palindrome = br.readLine().replaceAll(" ","");
        m = Integer.parseInt(br.readLine());
        for(int i=0; i<m; i++){
            String temp[] = br.readLine().split(" ");
            int start = Integer.parseInt(temp[0]);
            int end = Integer.parseInt(temp[1]);

            if(end-start+1 == 2){
                sb.append(0);
                sb.append("\n");
                continue;
            }

            String subString = palindrome.substring(start-1,end);
            if (isPalindrome(subString) ){
                sb.append(1);
            }
            else
                sb.append(0);
            sb.append("\n");
        }
        br.close();
    }

    private static boolean isPalindrome(String str) {
        String reverseStr =  new StringBuilder(str).reverse().toString();
        if (str.equals(reverseStr))
            return true;
        else
            return false;
    }
}

2. ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ด์šฉํ•œ ํ’€์ด (์ •๋‹ต)


package problem.dynamic.Q10942;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main_10942_2 {

    static int[] numbers;
    static int dp[][];
    static int n,m;
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        input();
        System.out.println(sb.toString());
    }

    private static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        String palindrome[] = br.readLine().split(" ");
        numbers = new int[n+1];
        dp = new int[n+1][n+1];
        for(int i=1; i<=n; i++){
            numbers[i] = Integer.parseInt(palindrome[i-1]);
        }
        solve();
        m = Integer.parseInt(br.readLine());
        for(int i=0; i<m; i++){
            String temp[] = br.readLine().split(" ");
            int start = Integer.parseInt(temp[0]);
            int end = Integer.parseInt(temp[1]);
            sb.append(dp[start][end]+"\n");
        }
        br.close();
    }

    private static void solve() {
        for (int i = 1; i <= n; i++) {
            dp[i][i] = 1;
        }

        for (int i = 1; i <= n - 1; i++) {
            if (numbers[i] == numbers[i + 1]) {
                dp[i][i + 1] = 1;
            } else {
                dp[i][i + 1] = 0;
            }
        }


        for (int j = 3; j <= n; j++) {
            for (int i = 1; i <= j; i++) {
                if (dp[i][j] == 1 || j - i == 1) {
                    continue;
                }
                if (dp[i + 1][j - 1] == 1 && numbers[i] == numbers[j]) {
                    dp[i][j] = 1;
                }
            }
        }
    }
}

Written on April 2, 2021