๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[๋ฐฑ์ค€ ์Šคํ„ฐ๋”” 11์ฃผ์ฐจ] 1509๋ฒˆ ํŒฐ๋ฆฐ๋“œ๋กฌ ๋ถ„ํ•  ๊ณจ๋“œ1 - ์ž๋ฐ”(JAVA) / ์กฐ๊ธˆ ์–ด๋ ค์šด DP

๐Ÿ“‘ ๋ฌธ์ œ

https://www.acmicpc.net/problem/1509

 

1509๋ฒˆ: ํŒฐ๋ฆฐ๋“œ๋กฌ ๋ถ„ํ• 

์„ธ์ค€์ด๋Š” ์–ด๋–ค ๋ฌธ์ž์—ด์„ ํŒฐ๋ฆฐ๋“œ๋กฌ์œผ๋กœ ๋ถ„ํ• ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ABACABA๋ฅผ ํŒฐ๋ฆฐ๋“œ๋กฌ์œผ๋กœ ๋ถ„ํ• ํ•˜๋ฉด, {A, B, A, C, A, B, A}, {A, BACAB, A}, {ABA, C, ABA}, {ABACABA}๋“ฑ์ด ์žˆ๋‹ค. ๋ถ„ํ• ์˜ ๊ฐœ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•˜

www.acmicpc.net

๋”๋ณด๊ธฐ
๋”๋ณด๊ธฐ

๋ฌธ์ œ

์„ธ์ค€์ด๋Š” ์–ด๋–ค ๋ฌธ์ž์—ด์„ ํŒฐ๋ฆฐ๋“œ๋กฌ์œผ๋กœ ๋ถ„ํ• ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 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

 

 

 

 

 

 

 

 

 

 

 

๐Ÿ’Ž ๐Ÿ’Ž ๐Ÿ’Ž

 

 

๏ผฐ๏ฝ๏ฝ“๏ฝ”๏ฝ…๏ฝ„ ๏ผข๏ฝ™ ๏ผณ๏ผก๏ผน

๐˜›๐˜ฉ๐˜ข๐˜ฏ๐˜ฌ๐˜ด ๐˜ง๐˜ฐ๐˜ณ ๐˜ณ๐˜ฆ๐˜ข๐˜ฅ๐˜ช๐˜ฏ๐˜จ