같은 문제를 두번째 풀어봤다. 첫번째 풀 때와 다른 방법으로 왜 이번엔 첫번째 풀 때 썼던 reverse가 생각 못했는지 두번째 풀 때는 for문을 사용했다.
이 문제를 처음 풀었을 때 제출한 코드도 다시 봤는데 for문을 안써도 되는데도 for문도 쓴 비효율적인 코드로 푼 것을 보고 노트 정리겸 작성해보고자 한다.
문제
알파벳 소문자로만 이루어진 단어가 주어진다. 이때, 이 단어가 팰린드롬인지 아닌지 확인하는 프로그램을 작성하시오.
팰린드롬이란 앞으로 읽을 때와 거꾸로 읽을 때 똑같은 단어를 말한다.
level, noon은 팰린드롬이고, baekjoon, online, judge는 팰린드롬이 아니다.
제출한 코드
#include <bits/stdc++.h>
using namespace std;
int main (){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
string s;
cin >> s;
for(int i = 0; i < s.size() / 2; i++){
if(s[i] != s[s.size() - (i + 1)]){
cout << 0;
return 0;
}
}
cout << 1 <<"\n";
return 0;
}
이번에 다시 풀어서 제출한 코드이다.
문자열의 끝까지 확인할 필요가 없기 때문에 반복문 횟수를 배열 사이즈 / 2
로 설정했다.
처음 풀었었던 코드
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
string s;
cin >> s;
string copy = s;
reverse(copy.begin(), copy.end());
bool isPal = false;
for(int i = 0; i < s.size(); i++){
if(s[i] != copy[i]){
cout << 0;
isPal = false;
break;
}else{
isPal = true;
}
}
if(isPal) cout << 1;
return 0;
}
여기서는 reverse를 사용했는데 왜 또 반복문으로 하나씩 기존 문자열과 같은지 확인했는지 모르겠다.. 또륵..
지금 이 코드를 고쳐보면 엄청 코드도 짧아지고 풀이 자체도 단순해진다.
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
string s;
cin >> s;
string copy = s;
reverse(copy.begin(), copy.end());
if(copy == s) cout << 1;
else cout << 0;
return 0;
}
어차피 팰린드롬이면 현재 문자나 거꾸로 뒤집은 문자나 똑같을 텐데 반복문을 돌려서 하나하나 확인하는 정성이 필요 없었다.
잊지말자 reverse.....