C++/백준

[C++] 백준) 1259번 팰린드롬수 문제풀이

S_Hoon 2020. 8. 23. 01:21

https://www.acmicpc.net/problem/1259

 

1259번: 팰린드롬수

문제 어떤 단어를 뒤에서부터 읽어도 똑같다면 그 단어를 팰린드롬이라고 한다. 'radar', 'sees'는 팰린드롬이다. 수도 팰린드롬으로 취급할 수 있다. 수의 숫자들을 뒤에서부터 읽어도 같다면 그 ��

www.acmicpc.net

문제

어떤 단어를 뒤에서부터 읽어도 똑같다면 그 단어를 팰린드롬이라고 한다. 'radar', 'sees'는 팰린드롬이다.

수도 팰린드롬으로 취급할 수 있다. 수의 숫자들을 뒤에서부터 읽어도 같다면 그 수는 팰린드롬수다. 121, 12421 등은 팰린드롬수다. 123, 1231은 뒤에서부터 읽으면 다르므로 팰린드롬수가 아니다. 또한 10도 팰린드롬수가 아닌데, 앞에 무의미한 0이 올 수 있다면 010이 되어 팰린드롬수로 취급할 수도 있지만, 특별히 이번 문제에서는 무의미한 0이 앞에 올 수 없다고 하자.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 1 이상 99999 이하의 정수가 주어진다. 입력의 마지막 줄에는 0이 주어지며, 이 줄은 문제에 포함되지 않는다.

출력

각 줄마다 주어진 수가 팰린드롬수면 'yes', 아니면 'no'를 출력한다.

예제 입력 1 복사

121 1231 12421 0

예제 출력 1 복사

yes no yes


약간 까다로운 문제인데

정답을 보신다면 약간의 허무함을 느끼실겁니다. 저 또한 그랬습니다.

 

간단히 설명드리자면

미나미, 이채이, 1221 같이

앞으로 읽어도 뒤로 읽어도 똑같은 string을 판단하는 문제입니다.

 

string을 절반으로 나누어서 비교하면 됩니다.


일단 필요한 변수들은

숫자를 담을 string(string으로 해야 나누기가 쉬움)

 

기준을 나누어줄 bool 타입인 pivot

string의 길이를 저장하는 int 타입의 변수(이것은 선택)

#include <iostream>
#include <string>

int main() {
    std::string num; 
    while(std::cin >> num) { // string을 이런식으로도 입력받을 수 있습니다.
        if(num == "0") break; // 0을 입력하면 while문이 종료됩니다.
        bool pivot = true;    // TMI) pivot은 하나의 '축'을 의미합니다.
        int len = num.length(); // 이 변수는 없어도 됩니다.
        
        for(int i = 0; i < len / 2; i++) { // 절반만 비교하면 되기에 len / 2까지 for문 반복
            if(num[i] != num[len - i - 1]) { // 1221로 예를 들면 맨 앞의 1과 맨 뒤의 1을 비교해서 다르면 pivot = false
                pivot = false;
                break;
            }
        }
        // pivot이 true라면 yes, false라면 no를 출력합니다.
        // if문을 간단하게 해주는 문법입니다.
        (pivot ? std::cout << "yes\n" : std::cout << "no\n");
    }
    return 0;
}

#include <iostream>
#include <string>

int main() {
    std::string num;
    while(std::cin >> num) {
        if(num == "0") break;
        bool pivot = true;
        int len = num.length();
        
        for(int i = 0; i < len / 2; i++) {
            if(num[i] != num[len - i - 1]) {
                pivot = false;
                break;
            }
        }
        
        (pivot ? std::cout << "yes\n" : std::cout << "no\n");
    }
    return 0;
}

처음으로 이런 문제를 만나면 

입력을 int로 받아야하는지 string으로 받아야하는지

int로 받으면 뒤에 수랑 어떻게 비교를 하지

string으로 받으면 뒤에 수랑 어떻게 비교를 하지 

이러한 고민들로 문제풀이를 시작조차 못하실 수 있습니다.

 

하지만 대부분의 비교하는 문제는

char또는 string으로 진행됩니다.

 

PS는 문제를 풀면 풀수록 실력이 증가하니 포기하지 마세요