문제
https://www.acmicpc.net/problem/1695
풀이(30분)
import java.io.*;
import java.util.*;
public class Main {
static int n;
static int[][] dp;
static int[] arr;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st ;
n = Integer.parseInt(br.readLine());
dp = new int[n+1][n+1];
arr = new int[n+1];
for(int i=0;i<n;i++){
Arrays.fill(dp[i],-1);
}
st = new StringTokenizer(br.readLine());
for(int i = 0; i < n; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
int res = dp(0,n-1);
System.out.println(res);
}
public static int dp(int left, int right){
if(left>=right){
return 0;
}
// 탐색된 적이 있다면 반환
if(dp[left][right]!=-1){
return dp[left][right];
}
int min = 0;
// 팰린드롬이라면 양쪽 인덱스 모두 변경
if(arr[left]==arr[right]){
min =dp(left+1,right-1);
}else{ // 팰린드롬이 아니라면 양쪽에 대해 모두 비교
min = Math.min(dp(left+1,right)+1 ,dp(left,right-1)+1);
}
return dp[left][right]=min;
}
}
문제 풀이 전략
양쪽 인덱스를 모두 변경해 가며 dp를 통해 메모이제이션 하는 방식이다.
양쪽 인덱스를 모두 봐야하는 예시는 다음과 같다.
1. 양쪽 인덱스 변경에 대해 똑같은 경우
ex) 1 2 3 의 경우 1 2 3 2 1이 될 수도 있고, 3 2 1 2 3이 될 수도 있다.
2. 양쪽 인덱스 변경에 대해 다른 경우
ex) 1 1 3의 경우 오른쪽만 보면 1 1 3 1 1로 만들어야 하지만, 왼쪽을 본다면 3 1 1 3 같은 경우도 가능하다.
'문제 풀이 > 백준' 카테고리의 다른 글
[백준] 14725번. 개미굴(JAVA) (0) | 2025.04.10 |
---|---|
[백준] 1937번. 욕심쟁이 판다(JAVA) (1) | 2025.04.09 |
[백준] 1613번. 역사(JAVA) (0) | 2025.04.07 |
[백준] 1516번. 게임 개발(JAVA) (0) | 2025.04.07 |
[백준] 17472번. 다리 만들기 2(JAVA) (0) | 2025.04.07 |