반응형
https://www.acmicpc.net/problem/17609
17609번: 회문
각 문자열이 회문인지, 유사 회문인지, 둘 모두 해당되지 않는지를 판단하여 회문이면 0, 유사 회문이면 1, 둘 모두 아니면 2를 순서대로 한 줄에 하나씩 출력한다.
www.acmicpc.net
[ 문제풀이 ]
1. 문자열을 입력받아 str 변수에 저장합니다.
2. s = 0, e = str.size() - 1에서 시작하여 s < e 일 때까지 투포인터를 활용하여 단어가 같다면 s++, e--, 단어가 다르다면 erase flag를 통해 지운 지 지우지 않았는지를 체크하고, s++일 때와 e--일 때를 총 두 번 구해줍니다.
3. 만약 erase == false, ans == true라면 0을, erase == true, ans == true라면 1을, 둘 다 아니라면 2를 출력합니다.
[ 소스코드 ]
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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | #include<iostream> #include<string> using namespace std; int T; bool erase; bool check(string str, int num) { int s = 0, e = str.size() - 1; while (s < e) { if (str[s] == str[e]) { s++; e--; } else { if (!erase) { if (num == 1) { if (str[s + 1] == str[e]) { s++; erase = true; } } else { if (str[s] == str[e - 1]) { e--; erase = true; } } if (!erase) { return false; } } else { return false; } } } return true; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> T; while (T--) { erase = false; string str; cin >> str; erase = false; if (check(str, 1)) { if (erase) { cout << 1; } else { cout << 0; } cout << '\n'; continue; } erase = false; if (check(str, 2)) { if (erase) { cout << 1; } else { cout << 0; } cout << '\n'; continue; } cout << 2; cout << '\n'; } } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 12761번 - 돌다리 (C++) (0) | 2023.09.21 |
---|---|
[ 백준 ] 12016번 - 라운드 로빈 스케줄러 (C++) (0) | 2023.09.20 |
[ 백준 ] 5569번 - 출근 경로 (C++) (0) | 2023.09.18 |
[ 백준 ] 13398번 - 연속합 2 (C++) (0) | 2023.09.17 |
[ 백준 ] 20183번 - 골목 대장 호석 - 효율성 2 (C++) (0) | 2023.09.16 |