GitHubSeob
C++ / 백준 / 17609 / 회문 본문
문제
https://www.acmicpc.net/problem/17609
17609번: 회문
각 문자열이 회문인지, 유사 회문인지, 둘 모두 해당되지 않는지를 판단하여 회문이면 0, 유사 회문이면 1, 둘 모두 아니면 2를 순서대로 한 줄에 하나씩 출력한다.
www.acmicpc.net
문제풀이
왼쪽, 오른쪽, 문자를 삭제한 개수의 정보를 갖는 DFS함수를 만들어서 풀었다.
문자열을 입력받고 왼쪽은 0, 오른쪽은 문자열 길이-1, 삭제한 문자열 개수는 0으로 둔다.
왼쪽이 오른쪽을 넘어서면 탐색을 다 했으므로 answer값을 최솟값으로 갱신한다.
왼쪽 문자와 오른쪽 문자가 같으면 각각 한 칸씩 옮기고 DFS함수를 실행한다.
왼쪽문자와 오른쪽문자가 다를 경우 조건을 확인하고 만족하면 조건문을 실행한다.
왼쪽 문자를 한 칸 옮겨서 오른쪽문자와,
오른쪽 문자를 한 칸 옮겨서 왼쪽문자와 비교하는 조건문이다.
탐색이 끝났으면 답을 출력한다.
코드
#include <iostream>
#include <string>
using namespace std;
string s;
int answer;
void DFS(int left, int right, int cnt) {
if (left >= right) {
answer = min(answer, cnt);
return;
}
else if (cnt >= 2) {
return;
}
else if (s[left] != s[right]) {
if (s[left + 1] == s[right])
DFS(left + 1, right, cnt + 1);
if (s[left] == s[right - 1])
DFS(left, right - 1, cnt + 1);
}
else {
DFS(left + 1, right - 1, cnt);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int T(0);
cin >> T;
while (T--) {
cin >> s;
answer = 2;
DFS(0, s.size() - 1, 0);
cout << answer << '\n';
}
}
'Baekjoon > Gold' 카테고리의 다른 글
C++ / 백준 / 20210 / 파일 탐색기 (0) | 2023.06.20 |
---|---|
C++ / 백준 / 20437 / 문자열 게임 2 (0) | 2023.06.19 |
C++ / 백준 / 1202 / 보석 도둑 (0) | 2023.06.16 |
C++ / 백준 / 9466 / 텀 프로젝트 (0) | 2023.06.14 |
C++ / 백준 / 1826 / 연료 채우기 (0) | 2023.06.14 |