1. 문제 접근
- 팰린드롬을 만드는 방법
- 문자열의 처음과 문자열의 끝 문자열부터 점차 좁혀가면서 탐색하는 방법을 사용
2. 시행착오
- 없음
- 그러나 더 간단한
reverse()
방법을 미처 생각하지 못했다.
3. 코드 및 풀이
3.1 단순 반복문 구현
start_idx
가 문자열의 인덱스, end_idx
가 문자열의 끝 인덱스를 가리키게 한 다음 while문으로 반복
- 탐색하다가 가리키는 두 문자열이 일치하지 않으면
is_pal
변수를 0으로 설정
- 중간에
break
문에 걸리지 않고 다 돌았으면 팰린드롬
- 문자열 길이가 1개라면, 애초에 반복문이 돌지 않을것이므로 무조건 팰린드롬 처리(
is_pal
의 초기값 = 1)
#include <bits/stdc++.h>
using namespace std;
string s;
int start_idx, end_idx;
bool is_pal = 1;
int main(){
cin >> s;
start_idx = 0;
end_idx = s.length() - 1;
while (start_idx < end_idx){
if(s[start_idx] != s[end_idx]){
is_pal = 0;
break;
}
start_idx++;
end_idx--;
}
cout << is_pal;
return 0;
}
3.2 reverse()
함수 사용
- STL에서 지원하는
reverse()
를 사용하면 더 간단하게 풀린다
#include <bits/stdc++.h>
using namespace std;
string s, temp;
int main(){
cin >> s;
temp = s;
reverse(temp.begin(), temp.end());
if(s == temp) cout << 1 << '\n';
else cout << 0 << '\n';
return 0;
}
4. Side
- 3.2방법에서 의문이 들었던 것은,
temp = s
를 할 때, 문자열끼리 깊은 복사인가 얕은 복사인가가 궁금했다.
- 실제로는 깊은 복사가 이루어진다고 함
- 따라서
temp
의 값이 변경되어도 s
는 변경되지 않음
- 이렇게 대입연산자로 할당하는 것은 오직 C++에서만 작용
- 따라서 C++ 다음 코드와 같이 할당연산자를 통해 문자열을 대입하면
temp
와 s
모두 다른 메모리를 참조하는 것을 볼 수 있다.
#include <bits/stdc++.h>
using namespace std;
string s, temp;
int main(){
cin >> s;
temp = s;
printf("Before change \ns : %s, temp : %s\n", s.c_str(), temp.c_str());
cout << &s << '\n';
cout << &temp << '\n';
temp[0] = 'c';
printf("After change \ns : %s, temp : %s\n", s.c_str(), temp.c_str());
cout << &s << '\n';
cout << &temp << '\n';
return 0;
}
>>>
baekjoon
Before change
s : baekjoon, temp : baekjoon
0x404300
0x404320
After change
s : baekjoon, temp : caekjoon
0x404300
0x404320
Reference