DP

10-11: 팰린드롬 만들기

SWC123 2018. 10. 25. 21:51

팰린드롬 만들기

 

문제


팰린드롬이란, 앞으로 읽으나 뒤로 읽으나 똑같은 문자열을 말한다. 예를 들어, “abcba”, “abccba” 등이 있을 수 있다. 문자열이 주어질 때, 이를 팰린드롬으로 만들기 위하여 추가해야 하는 최소의 문자 개수를 출력하는 프로그램을 작성하시오. 예를 들어, 문자열이 “abca” 로 주어질 경우, ‘b’만 추가하면 “abcba” 를 만들 수 있으므로, 이 때는 1개의 문자만 추가하면 된다. 또 다른 예로써, 문자열이 “adcba” 로 주어질 경우에는, 문자 2개를 추가해야 한다.

 

입력


첫 번째 줄에 문자열이 주어진다. 이 문자열의 길이는 1,000 을 넘지 않는다.  

출력


주어진 문자열을 팰린드롬으로 만들기 위해서 추가해야 하는 문자 개수의 최솟값을 출력한다.

 

예제 입력

adcba

예제 출력

2

 

예제 입력

abccbdbac

예제 출력

3

 

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

public class dp_palindrome {

/**
* 팰린드롬 만들기
* 문제:
* 팰린드롬이란, 앞으로 읽으나 뒤로 읽으나 똑같은 문자열을 말한다. 예를 들어, “abcba”, “abccba” 등이 있을 수 있다.
* 문자열이 주어질 때, 이를 팰린드롬으로 만들기 위하여 추가해야 하는 최소의 문자 개수를 출력하는 프로그램을 작성하시오.
* 예를 들어, 문자열이 “abca” 로 주어질 경우, ‘b’만 추가하면 “abcba” 를 만들 수 있으므로, 이 때는 1개의 문자만 추가하면 된다. 또 다른 예로써, 문자열이 “adcba” 로 주어질 경우에는, 문자 2개를 추가해야 한다.
*
* 입력: 첫 번째 줄에 문자열이 주어진다. 이 문자열의 길이는 1,000 을 넘지 않는다.
*
*
* 출력: 주어진 문자열을 팰린드롬으로 만들기 위해서 추가해야 하는 문자 개수의 최솟값을 출력한다.
*
*
* 예제 입력: adcba
*
*
* 예제 출력: 2
*
*
* @param args
*/

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s1 = br.readLine();

int[][]dp = new int[s1.length()][s1.length()];
//let dp[i][j] be min num of chars needed for s1.substring(i~j+1) to be a palidrome

//Initial condition:
dp[0][0] = 0;

//populate single chars: already palindromes.

for (int i = 1; i<s1.length(); i++){

for (int j=0; j<s1.length()-i; j++){
if (s1.charAt(j) == s1.charAt(i+j)){
dp[j][i+j] = dp[j+1][i+j-1];
} else {
dp[j][i+j] = 1 + Math.min(dp[j][i+j-1], dp[j+1][i+j]);
}
}
}

System.out.println(dp[0][s1.length()-1]);



}
}