๐ ๋ฌธ์
https://www.acmicpc.net/problem/1509
๋ฌธ์
์ธ์ค์ด๋ ์ด๋ค ๋ฌธ์์ด์ ํฐ๋ฆฐ๋๋กฌ์ผ๋ก ๋ถํ ํ๋ ค๊ณ ํ๋ค. ์๋ฅผ ๋ค์ด, ABACABA๋ฅผ ํฐ๋ฆฐ๋๋กฌ์ผ๋ก ๋ถํ ํ๋ฉด, {A, B, A, C, A, B, A}, {A, BACAB, A}, {ABA, C, ABA}, {ABACABA}๋ฑ์ด ์๋ค.
๋ถํ ์ ๊ฐ์์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ์ด ๋ฌธ์์ด์ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๊ณ , ์ต๋ ๊ธธ์ด๋ 2,500์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํฐ๋ฆฐ๋๋กฌ ๋ถํ ์ ๊ฐ์์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
โ๏ธ ํ์ด
์ด ๋ฌธ์ ๋ ์ ๋ง ์ด๋ ค์ ๋ค.. (https://lotuslee.tistory.com/6) ์ด ๋งํฌ์ ํ์ด๋ฅผ ๋ณด๊ณ ๊ฒจ์ฐ ์ดํดํ๋ค.
์ด๋ ค์ด DP ๋ฌธ์ ๋ผ๊ณ ํ ์ ์๋ค!
๐ก ํน์ ๋ฌธ์์ด์ i๋ฒ์งธ ์์น๊ฐ ์์ ๋, 0๋ฒ์งธ๋ถํฐ i๋ฒ์งธ ์ฌ์ด์ j๋ฅผ ๋๊ณ j๋ถํฐ i๊น์ง๊ฐ ํฐ๋ฆฐ๋๋กฌ์ธ์ง ํ์ธํ๋ค.
๋ง์ฝ ํฐ๋ฆฐ๋๋กฌ์ด๋ผ๋ฉด, dp[i]๋ ํ์ฌ ์ ์ฅ๋์ด์๋ ํฐ๋ฆฐ๋๋กฌ ๊ฐ์(dp[i])์ dp[j-1]+1 ์ค ์์ ๊ฐ์ด ๋ ๊ฒ์ด๋ค. dp[j-1]+1์์ 1์ด ๋ปํ๋ ๊ฒ์ด ๋ฐ๋ก j๋ถํฐ i๊น์ง๊ฐ ํฐ๋ฆฐ๋๋กฌ์ด๋ผ๋ ๊ฒ์ด๋ค.
1. ๋ชจ๋ ๋ถ๋ถ ๋ฌธ์์ด์ ๋ํ์ฌ ํฐ๋ฆฐ๋๋กฌ์ ํ์ธํ๋ค (checkPalindrome)
2. 1~i๋ฒ์งธ๊น์ง์ ๋ฌธ์์ด์ ๋ํ์ฌ, ๋ถ๋ถ ํฐ๋ฆฐ๋๋กฌ์ ํ์ธํ๋ค.
3. ๋ถ๋ถ ํฐ๋ฆฐ๋๋กฌ์ ๊ฒฝ์ฐ, 1๊ณผ i ์ฌ์ด์ ๊ฐ j์ ๋ํ์ฌ, j~i๊ฐ ํฐ๋ฆฐ๋๋กฌ์ด๋ฉด ํ๋์ ๋ฌธ์์ด๋ก ๋ณด๊ณ , dp[j-1]์ 1์ ๋ํด์ค ๊ฐ์ ๊ธฐ์กด์ ๊ฐ๊ณผ ๋น๊ตํ์ฌ ๋ ์์ ์๋ก ์ ๋ฐ์ดํธํ๋ ๊ฒ์ด๋ค.
๐ป ์์ค์ฝ๋: ์๋ฐ(Java)
// https://lotuslee.tistory.com/6
public class Main_๋ฐฑ์ค_1509_ํฐ๋ฆฐ๋๋กฌ๋ถํ _๊ณจ๋I {
static int N;
static int[] dp;
static boolean[][] palindrome;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
N = str.length();
str = "."+str;
palindrome = new boolean[N+1][N+1];
dp = new int[N+1]; // 1~i๋ฒ์งธ๊น์ง์ ๋ฌธ์์ด์์ ํฐ๋ฆฐ๋๋กฌ์ ๊ฐ์๋ฅผ ์ ์ฅ
// str์ ๋ถ๋ถ๋ฌธ์์ด์ ๋ํ ํฐ๋ฆฐ๋๋กฌ์ ๋ชจ๋ ์ฒดํฌํ๋ค.
checkPalindrome(str);
Arrays.fill(dp, Integer.MAX_VALUE);
dp[0] = 0;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= i; j++) {
if(palindrome[j][i]) dp[i]=Math.min(dp[i], dp[j-1]+1);
}
}
System.out.println(dp[N]);
}//end of main
private static void checkPalindrome(String str) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= i; j++) {
boolean flag = true;
int from = j;
int to = i;
while(from<=to) {
if(str.charAt(from++) != str.charAt(to--)) {
flag = false;
break;
}
}
if(flag) palindrome[j][i] = true;
}
}
}
}//end of class
๐ ๐ ๐
๏ผฐ๏ฝ๏ฝ๏ฝ๏ฝ ๏ฝ ๏ผข๏ฝ ๏ผณ๏ผก๏ผน
๐๐ฉ๐ข๐ฏ๐ฌ๐ด ๐ง๐ฐ๐ณ ๐ณ๐ฆ๐ข๐ฅ๐ช๐ฏ๐จ