알고리즘 문제/BOJ
17609번 회문
parkit
2019. 10. 13. 17:10
728x90
반응형
https://www.acmicpc.net/problem/17609
결국 완전한 회문이거나, 1개의 문자'만' 빼서 회문인지 판별하면 된다.
처음(0)과 끝(s.length() - 1)을 기준으로 같으면, ++left, --right 해주어 비교한다.
진행 중 s[left], s[right]가 다르다면(=13번 째 줄),
(코드에서는 변수명이 l, r로 바뀜. 설명 편의상 left, right로 말하는 것이다.)
그 기점을 기준으로 left + 1하여 ++left, --right하거나
right - 1하여 ++left, --right를 한다.
어차피 결국은 유사 회문은 단 1개만(달라진 기점) 무시하면 되기 때문이다.
위의 2가지 경우 모두 다르면, ret는 2가 될 것이다.
1개라도 같으면, ret는 1이 될 것이고, 이는 유사 회문이다.
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 46 47 48 49 50 51 52 | #include <bits/stdc++.h> using namespace std; int N; int palindrome(string s) { int ret = 0, left = 0, right = s.length() - 1; while (left <= right) { if (s[left] == s[right]) ++left, --right; else { int l = left, r = right; ++l; while (l < r) { if (s[l] != s[r]) { ++ret; break; } ++l; --r; } l = left, r = right; --r; while (l < r) { if (s[l] != s[r]) { ++ret; break; } ++l; --r; } return ret; } } return ret; } int main(void) { //freopen("C:\\Users\\park7\\Desktop\\sample_input.txt", "r", stdin); string s; scanf("%d", &N); getchar(); for (int i = 0; i < N; i++) { cin >> s; printf("%d\n", palindrome(s)); } return 0; } | cs |
728x90
반응형