팰린드롬 판별법
https://jinhg0214.github.io/posts/bj_1990/를 복기하던 중
소수 판별을 개선하는 방법도 있는데
팰린드롬도 더 효율적으로 찾는 방법이 있지 않을까 생각이 들어서
찾아서 정리해봄
팰린드롬이란?
회문(Palindrome)
거꾸로 읽어도 제대로 읽는 것과 같은 문장이나 낱말, 숫자, 문자열
수박이박수, racecar, 1234321, 다시합창합시다
1. 기본 방법
- 첫 문자와 끝 문자부터 시작하여 안쪽으로 차례차례 비교한다
- 가장 직관적인 방법
- 펠린드롬이 맞는 경우, N/2 번 반복문이 실행되므로 시간 복잡도는 O(N)
1 2 3 4 5 6 7 8 9 10 11
bool IsPalindrome(string s){ int size = s.size(); for(int i=0; i < size/2; i++){ if(s[i] != s[size-1-i]{ return false; }) } return true; }
2. STL을 이용하는 방법
reverse
함수를 이용하는 방법- 뒤집어진 문자열을 복사해 원문과 같은지 확인함
1 2 3 4 5 6
bool IsPalindrome(string str){ string str_rev = str; reverse(str_rev.begin(), str_rev.end()); return str_rev == str; }
equal
을 이용하는 방법- 원문의 시작지점
str.begin()
부터 - 원문의 중앙 지점
str.begin() + str.size()/2
까지 - 원문의 맨 뒤에서부터 비교하여 값을 확인한다
- 매우 짧게 가능
1 2 3
bool IsPalindrome(string str){ return equal(str.begin(), str.begin() + str.size()/2, str.rbegin()); }
- 이게 가장 간단해서 이걸 쓰는 연습을 해야할듯함
DP(재귀)를 이용한 방법
- 함수에서 첫글자와 마지막 글자만 비교하고, 나머지 가운데는 재귀로 호출하는 방법
12321
을 받았다면, 시작지점의1
과 마지막1
을 비교하고 맞다면232
에 대한 펠린드롬 체크를 호출함1 2 3 4 5 6 7 8 9 10 11 12 13
bool IsPalindrome(string str, int start, int end){ if( start >= end ){ // 기저 조건 : 펠린드롬 판별이 끝난 경우 return true; } // 글자를 비교 if(str[start] != str[end]){ return false; } // 부분 문자열에 대해 펠린드린 체크 호출 return IsPalindrome(str,start+1, end-1); }
숏코딩
1
2
#import<bits/stdc++.h>
std::string a;main(){std::cin>>a;std::cout<<equal(a.begin(),a.end(),a.rbegin());}
1
a=input();print(+(a[::-1]==a))
이게 무슨
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.