10942번: 팰린드롬?

 

N개의 자연수, M개의 질문

질문은 S E 형태. S번째 수부터 E번째 까지 수가 팰린드롬을 이루는가? → 이루면 1 아니면 0

(1≤N≤2,000, 자연수 ≤ 100,000, 1≤ M ≤ 1,000,000)

M개의 질문에 대해 매번 팰린드롬 여부를 판단하는 것은 시간초과이다.

답을 구해 놓고 쿼리를 순회하며 답을 출력해야 할 것 같다.

package boj;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class BOJ10942 {
    static int N, M;
    static int[] nums;
    static int[][] queries;
    static FastReader scan = new FastReader();
    static boolean[][] dp;

    static void input() {
        N = scan.nextInt();
        nums = new int[N];
        for (int i = 0; i < N; i++) {
            nums[i] = scan.nextInt();
        }
        M = scan.nextInt();
        queries = new int[M][2];
        for (int i = 0; i < M; i++) {
            queries[i] = new int[]{scan.nextInt(), scan.nextInt()};
        }
        dp = new boolean[N][N];
    }

    static void solve() {
        for (int s = 0; s < N; s++) {
            // 홀수개 팰린드롬
            checkPalindrome(s, s);
            // 짝수개 팰린드롬
            checkPalindrome(s, s + 1);
        }

        StringBuilder sb = new StringBuilder();
        for (int[] query : queries) {
            int s = query[0] - 1;
            int e = query[1] - 1;
            boolean result = dp[s][e];
            sb.append(result == true ? 1 : 0).append("\\n");
        }
        System.out.println(sb);
    }

    static void checkPalindrome(int l, int r) {
        while (l >= 0 && r < N) {
            if (nums[l] == nums[r]) {
                dp[l][r] = true;
                l--;
                r++;
            } else {
                return;
            }
        }
    }

    public static void main(String[] args) {
        input();
        solve();
    }

    static class FastReader {
        BufferedReader br;
        StringTokenizer st;

        public FastReader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        String next() {
            while (st == null || !st.hasMoreElements()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(next());
        }

        long nextLong() {
            return Long.parseLong(next());
        }

        String nextLine() {
            String str = "";
            try {
                str = br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return str;
        }
    }
}

'Algorithm > BOJ' 카테고리의 다른 글

BOJ 4991 - 로봇 청소기  (0) 2024.11.11
BOJ 11049 - 행렬 곱셈 순서  (1) 2024.11.09
BOJ 6087 - 레이저 통신  (0) 2024.11.07
BOJ 10021 - Watering the Fields  (0) 2024.11.06
BOJ 2292 - 벌집  (5) 2024.11.06

+ Recent posts