[백준] 10942 팰린드롬
유형
- DP로 해결
- 재귀와 비재귀로 풀 수 있음 (주석 처리는 재귀 코드)
코드
// 10942.팰린드롬
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// import java.util.Arrays;
import java.util.StringTokenizer;
public class DP_Palindrome {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static boolean[][] dp;
static int[] num;
static int N;
// static int[][] dp;
public static void main(String[] args) throws NumberFormatException, IOException {
N = Integer.parseInt(br.readLine());
num = new int[N+1];
dp = new boolean[N+1][N+1];
// dp = new int[N][N];
StringTokenizer stz = new StringTokenizer(br.readLine());
for(int i = 1; i <= N; i++) {
num[i] = Integer.parseInt(stz.nextToken());
// 재귀
// Arrays.fill(dp[i], -1);
}
//비재귀
solve();
int M = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for(int i = 0; i < M; i++) {
stz = new StringTokenizer(br.readLine());
int S = Integer.parseInt(stz.nextToken());
int E = Integer.parseInt(stz.nextToken());
if(dp[S][E]) sb.append("1\n");
else sb.append("0\n");
// 재귀
// System.out.println(solve_recursive(S-1,E-1));
}
System.out.println(sb);
}
public static void solve() {
// 길이가 1일때 계산
for(int i = 1; i <= N; i++)
dp[i][i] = true;
// 길이가 2일때 계산
for(int i = 1; i <= N - 1; i++)
if(num[i] == num[i + 1]) dp[i][i + 1]= true;
// 길이가 3 이상일 때
for(int i = 2; i < N; i++){
for(int j = 1; j <= N - i; j++){
if(num[j] == num[j + i] && dp[j + 1][j + i - 1])
dp[j][j + i] = true;
}
}
}
// public static int solve_recursive(int S, int E) {
// if(S>=E) return 1;
// if(dp[S][E] != -1) return dp[S][E];
// if(num[S]!=num[E]) return 0;
// return solve_recursive(S+1, E-1);
// }
}
Author And Source
이 문제에 관하여([백준] 10942 팰린드롬), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@titu/알고리즘-백준-10942-팰린드롬저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)