[백준 14517번 C/C++] 팬린드롬 개수
[백준 14517번 C/C++] 팬린드롬 개수

https://www.acmicpc.net/problem/14517
14517번: 팰린드롬 개수 구하기 (Large)
팰린드롬(palindrome)이란 앞에서부터 읽으나 뒤에서부터 읽으나 같은 단어를 말한다. 'aba'나 'a'와 같은 단어는 팰린드롬이며, 'abaccbcb'나 'anavolimilana'와 같은 단어는 팰린드롬이 아니다. 승수는 주
www.acmicpc.net
해결전략
팰린드롬 Palindrome
포함 배제의 원리
동적계획법 Dynamic Programming
처음 시도한 코드 - 시간초과
#include <iostream> #include <string> #include <vector> #include <set> #include <unordered_set> using namespace std; string s; unordered_multiset<string> mySet; vector<int> ch; vector<vector<int>> dp; int countPalindrome(const string& str, int start, int end) { if (start >= end) return 1; if (dp[start][end] != -1) return dp[start][end]; if (str[start] == str[end]) { dp[start][end] = countPalindrome(str, start + 1, end - 1); return dp[start][end]; } else { dp[start][end] = 0; return 0; } } void DFS(const string& str, int idx) { //cout << "str = " << str << "\n"; if (countPalindrome(str, 0, str.size() - 1)) { mySet.insert(str); } if (str.size() == s.size()) { return; } for (int i = idx; i < s.size(); i++) { if (ch[i] == 0) { ch[i] = 1; DFS(str + s[i], i+1); ch[i] = 0; } } } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> s; ch.resize(s.size()); dp.resize(s.size(), vector<int>(s.size(), -1)); DFS("", 0); cout << mySet.size() % 10007; return 0; }
정답 코드
#include <iostream> #include <string> #include <vector> using namespace std; const int MOD = 10007; // 모듈로 연산을 위한 상수 정의 string s; // 입력받을 문자열 vector<vector<int>> dp; // dp[a][b]는 [a, b] 구간에서의 팬린드롬의 개수를 저장 int DFS(int a, int b) { if (a > b) return 0; // 시작 인덱스가 인덱스보다 크면 0 반환 if (a == b) return 1; // 시작 인덱스와 끝 인덱스가 같으면 1 반환 (자기 자신은 팬린드롬) if (dp[a][b] != -1) return dp[a][b]; // 이미 계산된 값이면 그 값을 반환 // 팬린드롬의 개수 계산 dp[a][b] = (DFS(a, b - 1) + DFS(a + 1, b) - DFS(a + 1, b - 1)) % MOD; if (dp[a][b] < 0) // 모듈로 연산 결과가 음수이면 MOD를 더해줌 dp[a][b] += MOD; ifs[a] == s[b]) // 시작 문자와 끝 문자가 같으면 추가로 팬린드롬의 개수를 더해줌 dp[a][b] = (dp[a][b + DFS(a + 1, b - 1) + 1) % MOD; return dp[a][b] % MOD; } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> s; dp.resize(s.size(), vector<int>(s.size(), -1)); // dp 배열 크기를 문자열의 길이만큼 설정하고, 초기값을 -1로 설정 cout << DFS(0, s.size()-1) % MOD; return 0; }
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 13977번 C/C++] 이항 계수와 쿼리 (0) | 2024.03.08 |
---|---|
[백준 2357번 C/C++] 최솟값과 최댓값 (0) | 2024.03.03 |
[백준 2533번 C/C++] 사회망 서비스(SNS) (0) | 2024.02.22 |
[백준 1094번 C/C++] 막대기 (0) | 2024.02.17 |
[백준 14428번 C/C++] 수열과 쿼리 16 (0) | 2024.02.16 |
댓글
이 글 공유하기
다른 글
-
[백준 13977번 C/C++] 이항 계수와 쿼리
[백준 13977번 C/C++] 이항 계수와 쿼리
2024.03.08 -
[백준 2357번 C/C++] 최솟값과 최댓값
[백준 2357번 C/C++] 최솟값과 최댓값
2024.03.03 -
[백준 2533번 C/C++] 사회망 서비스(SNS)
[백준 2533번 C/C++] 사회망 서비스(SNS)
2024.02.22 -
[백준 1094번 C/C++] 막대기
[백준 1094번 C/C++] 막대기
2024.02.17
댓글을 사용할 수 없습니다.