https://www.acmicpc.net/problem/15927
1) 풀이
뭔가 풀이방법은 알겠는데, 자꾸 틀려서 애를 먹었던 문제!
이 방법이 맞는 것 같은데, 며칠을 풀어도 자꾸 틀렸다거나, 시간초과가 떠서 답답해서 다른 분들의 풀이를 찾아보았다.
결론적으로 내가 생각한 방법이 맞지만, 인덱스 접근에서나 케이스마다 처리해주는 방식에서 조금 오류가 있었던 것 같다!!!!!!! 그래두 푼 게 어디야 ~
내가 참고한 블로그는 아래 참고자료에 첨부해두겠다용
0. 입력받은 문자열이 회문인지 아닌지 확인
»문자열의 문자들을 확인할 반복문을 만든다. 문자열의 맨 처음과 맨 끝을 먼저 비교해주는데, 앞쪽은 인덱스를 늘리고, 뒤쪽은 인덱스를 줄여가며 마치 중앙으로 모이는 듯한 모양으로 문자들을 비교해준다.
1. 문자열이 회문이 아닌 경우
»0과 같은 과정으로 비교했을 때, 두 문자가 서로 다르면 회문이 아닌 경우이므로 그대로 문자열 전체 길이를 출력하고 종료한다.
2. 문자열이 회문인 경우
2-1. 문자열이 모두 같은 문자로 이루어진 경우
: 회문이 아닌 경우가 존재하지 않으므로 -1을 출력한다.
2-2. 문자열이 모두 같은 문자는 아니지만, 회문인 경우
: 원래의 문자열에서 하나의 문자만 빼면 그 문자열은 회문이 아니다. 즉, 문자열 길이에서 1을 빼고 출력한다.
»문자열 내의 모든 문자를 확인하는 반복문을 만들고, 다른 문자가 한개라도 나올 경우 1-2로 처리하고 프로그램을 바로 종료한다. 반복문이 빠져나오면, 문자열 내의 모든 문자가 같다는 의미이므로 -1을 출력한다.
적고 보니 설명이 이해가 어려울 수도 있겠다는 생각이 든다.
코드를 함께 확인해보면 좋겠다!
2) 최종 소스코드
#include <bits/stdc++.h>
using namespace std;
string str;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> str;
for (int i = 0; i < str.length() / 2; i++) { //회문인지, 아닌지를 판단
if (str[i] != str[str.length() - 1 - i]) {//다르면, 회문 아님
cout << str.length() << '\n';
return 0;
}
}
//회문인 경우
char fir = str[0]; //0번째 인덱스의 문자와 비교해서 반복문을 빠져나간다면, 모두 같은 문자로 이루어진 문자열
for (int i = 1; i < str.length(); i++) {
if (fir != str[i]) { //서로 다른 문자열로 이루어진 회문
cout << str.length() - 1 << '\n';
return 0;
}
}
cout << -1 << '\n';
}
3) 참고자료
'Problem Solving > 백준' 카테고리의 다른 글
[백준/c++] 19637 - IF문 좀 대신 써줘 (0) | 2021.04.23 |
---|---|
[백준/c++] 21313 - 문어 (2) | 2021.04.18 |
[백준/c++] 14650 - 걷다보니 신천역 삼 (Small) (0) | 2021.03.24 |
[백준/c++] 13022 - 늑대와 올바른 단어 (0) | 2021.03.24 |
[백준/c++] 4459 - Always Follow the Rules in Zombieland (0) | 2021.03.18 |