백준 10998 팰린드롬인지 확인하기 (C++)

REASON·2022년 9월 23일
0

백준

목록 보기
5/7

백준 10988 팰린드롬인지 확인하기

같은 문제를 두번째 풀어봤다. 첫번째 풀 때와 다른 방법으로 왜 이번엔 첫번째 풀 때 썼던 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.....

0개의 댓글