[실전 문제] 팰린드롬 만들기
2021. 2. 27. 16:33ㆍ코딩 테스트/실전 문제
1. 문제
팰린드롬이란, 앞으로 읽으나 뒤로 읽으나 똑같은 문자열을 말한다. 예를 들어, “abcba”, “abccba” 등이 있을 수 있다. 문자열이 주어질 때, 이를 팰린드롬으로 만들기 위하여 추가해야 하는 최소의 문자 개수를 출력하는 프로그램을 작성하시오. 예를 들어, 문자열이 “abca” 로 주어질 경우, ‘b’만 추가하면 “abcba” 를 만들 수 있으므로, 이 때는 1개의 문자만 추가하면 된다. 또 다른 예로써, 문자열이 “adcba” 로 주어질 경우에는, 문자 2개를 추가해야 한다.
입력
첫 번째 줄에 문자열이 주어진다. 이 문자열의 길이는 1,000 을 넘지 않는다.
출력
주어진 문자열을 팰린드롬으로 만들기 위해서 추가해야 하는 문자 개수의 최솟값을 출력한다.
예제 입력
case 1) adcba
case 2) abccbdbac
예제 출력
case 1) 2
case 2) 3
2. 풀이
즉, 결국 점화식은 다음과 같다.
- T(i, j)은 i부터 j까지의 문자열을 팰린드롬으로 만들기 위해 추가해야하는 문자 개수의 최솟값
- 비교하고자 하는 문자가 같을 경우 T(i, j) = T(i+1, j-1)
- 비교하고자 하는 문자가 다를 경우 T(i, j) = min(T(i-1, j), T(i, j-1)) + 1
import java.io.*;
public class Main {
private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
String s = br.readLine();
int[][] arr = new int[s.length()][s.length()];
for(int i = s.length() - 1; i >= 0 ; i--) {
for(int j = i; j < s.length(); j++) {
if(i == j) arr[i][j] = 0;
else {
if(s.charAt(i) == s.charAt(j)) arr[i][j] = arr[i+1][j-1];
else arr[i][j] = Math.min(arr[i+1][j], arr[i][j-1]) + 1;
}
}
}
bw.write(arr[0][s.length()-1] + "");
br.close();
bw.flush();
bw.close();
}
}
728x90
'코딩 테스트 > 실전 문제' 카테고리의 다른 글
[실전 문제] 이상한 계산기 (0) | 2021.02.27 |
---|---|
[실전 문제] 2색 칠하기 (0) | 2021.02.27 |
[실전 문제] 두 문자열 사이의 거리 (0) | 2021.02.27 |
[실전 문제] 연속 부분 최대합 L (0) | 2021.02.27 |