Algorithm/BOJ
[백준 알고리즘/C++/그리디] 17609 회문
pinevienna
2021. 2. 9. 17:48
입력된 문자열이 회문, 유사회문, 둘다X 중 어디에 해당하는지 찾는 문제
문자열의 양 끝에서 부터 비교해오면 되는데
1. 모두 일치할 경우
2. 유사회문이 아닐 경우
3. 유사회문일지도 모르는 경우 → 일치하지 않는 지점부터 양쪽 문자 하나씩 번갈아 빼보며 다시 비교
이 순서로 판별하면 된다
시간제한이 있는 문제이므로 가지치기가 매우 중요하다
2번에서 하나를 뺀 나머지 문자열이 회문인 경우에 유사회문이 된다
회문이 아닐 경우에만 비교하도록 조건을 설정하여 시간을 줄여야하고 (코드 26번째 줄)
여기서 유사회문인지 아닌지가 판별되면 break 해줘서 시간을 줄여야한다 (코드 40번째 줄)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
#include <iostream>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int t;
string str;
cin >> t;
while (t--) {
cin >> str;
int res = 0;
for (int i = 0, j = str.size() - 1; i < j; i++, j--) {
if (str[i] == str[j]) continue;
//유사회문일 가능성이 없으면
if (str[i] != str[j - 1] && str[i + 1] != str[j]) {
res = 2;
break;
}
bool isPalindrome = false;
for (int k = 0; k <= 1 && isPalindrome == false; k++) {
int start = i, end = j;
k == 0 ? start++ : end--; //하나씩 번갈아가며 빼기
isPalindrome = true;
for (int a = start, b = end; a < b; a++, b--) {
if (str[a] != str[b]) {
isPalindrome = false;
break;
}
}
}
res = isPalindrome ? 1 : 2;
break;
}
cout << res << "\n";
}
}
|
cs |
답 찾아봤는데 괜히 찾아봤다ㅠ