hades

[Baekjoon] 1509๋ฒˆ: ํŒฐ๋ฆฐ๋“œ๋กฌ ๋ถ„ํ•  ๋ณธ๋ฌธ

๐Ÿ‘Š PS/Algorithm

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

hades1 2024. 9. 15. 18:59

๐Ÿฅ… ๋ฌธ์ œ

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

 

๐Ÿ” ์„ค๊ณ„

๋ถ€๋ถ„ ๋ฌธ์ž์—ด๋“ค ์ค‘์—์„œ ์–ด๋””์„œ๋ถ€ํ„ฐ ์–ด๋””๊นŒ์ง€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ์ง€ ๋จผ์ € ๊ตฌํ•ด์•ผ ํ•œ๋‹ค. ํŒฐ๋ฆฐ๋“œ๋กฌ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

๋ฌธ์ž ๊ฐœ์ˆ˜๊ฐ€ ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ, ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค.

๋ฌธ์ž ๊ฐœ์ˆ˜๊ฐ€ 2๊ฐœ์ธ ๊ฒฝ์šฐ, ๋‘ ๋ฌธ์ž๊ฐ€ ๊ฐ™์œผ๋ฉด ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค.

๋ฌธ์ž ๊ฐœ์ˆ˜๊ฐ€ 3๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ, ๋งจ ์•ž๊ณผ ๋งจ ๋’ค๊ฐ€ ๊ฐ™๊ณ , ๊ฐ€์šด๋ฐ๊ฐ€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋ฉด, ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค.

 

์ด์ œ ํŒฐ๋ฆฐ๋“œ๋กฌ์„ ๊ตฌํ–ˆ์œผ๋‹ˆ, ์ตœ์†Œ๋กœ ๋ถ„ํ• ํ•ด์•ผ ํ•œ๋‹ค. ์ตœ์†Œ ๋ถ„ํ•  ์ˆ˜๋Š” ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์–ด๋–ค ์ธ๋ฑ์Šค๊นŒ์ง€์˜ ์ตœ์†Œ ๋ถ„ํ•  ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋ฉด์„œ, ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฃผ์˜ํ•ด์•ผํ•  ์ ์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ฑ๋ฆฝํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ธฐ์กด์— ์ €์žฅ๋œ ๊ฐ’๊ณผ 0๋ถ€ํ„ฐ end ์‚ฌ์ด์˜ ์ธ๋ฑ์Šค๋ฅผ start๋ผ๊ณ  ํ•  ๋•Œ, start๋ถ€ํ„ฐ end๊นŒ์ง€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด ์„ฑ๋ฆฝํ•œ๋‹ค๋ฉด, end๊นŒ์ง€์˜ ํŒฐ๋ฆฐ๋“œ๋กฌ ์ตœ์†Œ ๋ถ„ํ•  ์ˆ˜๋Š” ๊ธฐ์กด๊ฐ’๊ณผ 0~start-1๊นŒ์ง€์˜ ๋ถ„ํ•  ์ตœ์†Œ ์ˆ˜ + 1 ์ค‘ ์ตœ์†Ÿ๊ฐ’์ด๋‹ค.

 

๐Ÿ‘Š ํ’€์ด

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

string str;
int len;
vector<vector<bool>> palindrome(2500, vector<bool>(2500, false));
vector<int> dp(2500, 1e9 + 7);

void make_palindrome() {
	for (int i = 0; i < len; i++) {
		palindrome[i][i] = true;
	}
	for (int i = 0; i < len - 1; i++) {
		if (str[i] == str[i + 1]) {
			palindrome[i][i + 1] = true;
		}
	}
	for (int diff = 2; diff < len; diff++) {
		for (int start = 0; start + diff < len; start++) {
			int end = start + diff;
			if ((str[start] == str[end]) && palindrome[start + 1][end - 1]) {
				palindrome[start][end] = true;
			}
		}
	}
}

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> str;
	len = str.length();

	make_palindrome();

	for (int end = 0; end < len; end++) {
		for (int start = 0; start <= end; start++) {
			if (palindrome[start][end] == true) {
				if (start == 0) {
					dp[end] = 1;
					continue;
				}
				dp[end] = min(dp[end], dp[start - 1] + 1);
			}
		}
	}

	cout << dp[len - 1] << "\n";

	return 0;
}