[C++] 백준 10988번 팰린드롬인지 확인하기
<문제>
https://www.acmicpc.net/problem/10988
10988번: 팰린드롬인지 확인하기
첫째 줄에 단어가 주어진다. 단어의 길이는 1보다 크거나 같고, 100보다 작거나 같으며, 알파벳 소문자로만 이루어져 있다.
www.acmicpc.net
<해결 방법>
팰린드롬이란 앞으로 읽을 때와 거꾸로 읽을 때 똑같은 단어를 말한다.
그래서 단어를 string으로 입력 받아와서 서로 대칭되는 배열 인덱스에 접근하여 두 문자가 동일한 지 확인해줬다.
쉽게 말하면,, string은 다음과 같이 표현할 수 있다.
1) 받아온 문자열 : level
index | 0 | 1 | 2 | 3 | 4 |
s[index] | l | e | v | e | l |
↑ left | right ↑ |
2) 받아온 문자열 : baekjoon
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
s[index] | b | a | e | k | j | o | o | n |
↑ left | right ↑ |
1. s[left]와 s[right]가 서로 동일한 문자다. -> left = left + 1 / right = right - 1
2. s[left]와 s[right]가 서로 동일하지 않다. -> 결과 : 팰린드롬 아님. 반복문 즉시 종료.
3. 단어가 팰린드롬 단어여서 계속해서 1번 과정을 거치다 보면 left가 right보다 커지는 순간이 오고, right가 left보다 작아지는 순간이 온다. 그 순간이 오게 되면 결과 : 팰린드롬. 반복문 종료.
예시 1 : level
단계 1 :
index | 0 | 1 | 2 | 3 | 4 |
s[index] | l | e | v | e | l |
↑ left | right ↑ |
s[left] == s[right]이므로 left = left + 1 / right = right - 1
단계 2 :
index | 0 | 1 | 2 | 3 | 4 |
s[index] | l | e | v | e | l |
↑ left | right ↑ |
s[left] == s[right]이므로 left = left + 1 / right = right - 1
단계 3 :
index | 0 | 1 | 2 | 3 | 4 |
s[index] | l | e | v | e | l |
↑ left, right |
level은 5자이기 때문에 left, right가 동시에 만난다. 그래서 s[left]와 s[right] 다를 수가 없기 때문에 우리는 이 단어를 팰린드롬으로 보고 결과를 true로 설정해준다.
예시 2 : baekjoon
단계 1 :
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
s[index] | b | a | e | k | j | o | o | n |
↑ left | right ↑ |
s[left]는 b이고, s[right]는 n이므로, 처음부터 같지 않기 때문에 결과는 false로 설정해주고, 반복문 즉시 종료.
자세한 건 코드로 보자.
<코드>
#include <iostream>
#include <string>
using namespace std;
int main() {
int result = 0, left, right;
string s;
//판별할 문자열 입력 받음
cin >> s;
left = 0;
right = s.size() - 1;
//판별 시작
while (1) {
//3번 경우
if (left >= right) {
result = 1;
break;
}
//2번 경우
else if (s[left] != s[right]) {
result = 0;
break;
}
//1번 경우
else {
left++;
right--;
}
}
cout << result;
return 0;
}
흐름을 잘 모르겠으면 비주얼 스튜디오를 설치해서 단계별로 실행으로 흐름을 보면 좋을 것 같다.
비주얼 스튜디오로 단계별로 실행하는 방법도 추후에 포스팅해야겠다.
<결과>