[알고리즘] Java / 백준 / 팰린드롬? / 10942

정현명·2022년 5월 3일
0

baekjoon

목록 보기
157/180
post-thumbnail

[알고리즘] Java / 백준 / 팰린드롬? / 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개가 모두 주어졌을 때, 명우의 대답을 구하는 프로그램을 작성하시오.


입력


첫째 줄에 수열의 크기 N (1 ≤ N ≤ 2,000)이 주어진다.

둘째 줄에는 홍준이가 칠판에 적은 수 N개가 순서대로 주어진다. 칠판에 적은 수는 100,000보다 작거나 같은 자연수이다.

셋째 줄에는 홍준이가 한 질문의 개수 M (1 ≤ M ≤ 1,000,000)이 주어진다.

넷째 줄부터 M개의 줄에는 홍준이가 명우에게 한 질문 S와 E가 한 줄에 하나씩 주어진다.


출력


총 M개의 줄에 걸쳐 홍준이의 질문에 대한 명우의 답을 입력으로 주어진 순서에 따라서 출력한다. 팰린드롬인 경우에는 1, 아닌 경우에는 0을 출력한다.


접근 방식


동적 계획법을 사용하면 풀 수 있는 문제였습니다.

dp[i][j] 는 i부터 j까지의 숫자 배열이 팰린드롬인지를 설명하는 배열입니다.

해당 질문에 대한 팰린드롬 검사를 했는지 안했는지를 구분하기 위해 dp배열의 초기값을 -1로 줍니다.

그 후 팰린드롬인지를 검사하여 팰린드롬이라면 1을 , 아니라면 0을 저장합니다.

자세한 알고리즘은 주석에 적었습니다.



코드


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

public class Main_10942 {

	public static int go(int S, int E) {
		// 이미 방문 했다면 팰린드롬 결과를 출력
		if(dp[S][E] != -1) {
			return dp[S][E];
		}
		
		// 양쪽의 숫자가 다르면 팰린드롬이 아님
		if(numArr[S] != numArr[E]) {
			return dp[S][E] = 0;
		}
		
		// 숫자배열 길이가 1이거나 2이면 팰린드롬
		if(S==E || S+1 == E) {
			return dp[S][E] = 1;
		}
		
		// 방문하지 않았고 숫자 배열의 길이가 3 이상이면서 양쪽의 숫자가 같으면 양쪽에서 한 칸씩 줄인 숫자 배열 확인
		return dp[S][E] = go(S+1,E-1);
		
	}
	
	
	
	static int N,M;
	static int[] numArr;
	static int[][] dp;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		N = Integer.parseInt(br.readLine());
		
		numArr = new int[N+1];
		dp = new int[N+1][N+1];
		StringTokenizer st = new StringTokenizer(br.readLine());
		for(int i=1;i<=N;i++) {
			numArr[i] = Integer.parseInt(st.nextToken());
			Arrays.fill(dp[i], -1); // 초기값을 -1로 설정
		}
		
		M = Integer.parseInt(br.readLine());
	
		StringBuilder sb = new StringBuilder();
		for(int i=0;i<M;i++) {
			st = new StringTokenizer(br.readLine());
			int S = Integer.parseInt(st.nextToken());
			int E = Integer.parseInt(st.nextToken());
			sb.append(go(S,E)+"\n");
		}
		
		System.out.print(sb);
		
	}

}
profile
꾸준함, 책임감

0개의 댓글