[백준 / 10988 / C++] 팰린드롬인지 확인하기

Park·2023년 9월 19일
0

코딩테스트 - Week1

목록 보기
4/15

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(){
    
    // Input string
    cin >> s;
    start_idx = 0;
    end_idx = s.length() - 1;
    
    // 2. Compare the left and right 
    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++ 다음 코드와 같이 할당연산자를 통해 문자열을 대입하면 temps 모두 다른 메모리를 참조하는 것을 볼 수 있다.

#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

profile
안녕하세요!

0개의 댓글