[Baekjoon/백준][1259][C/C++] 팰린드롬수
『목차』
0. 개요
1. 문제
2. 풀이
3. 코드
0. 개요
구현, 문자열 문제. 앞으로 수없이 나올 팰린드롬 문제의 서막이다.
1. 문제
https://www.acmicpc.net/problem/1259
1259번: 팰린드롬수
입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 1 이상 99999 이하의 정수가 주어진다. 입력의 마지막 줄에는 0이 주어지며, 이 줄은 문제에 포함되지 않는다.
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
2. 풀이
풀이에 앞서
fgets함수의 사용방법을 익힌 후 풀어야 헤매지 않고 풀 수 있다. 아래 링크를 참조하자.
[C][header][stdio.h] fgets
fgets #include // C++ 의 경우 char* fgets(char* str, int num, FILE* stream); 특징 1. 개행(=newline)(='\n') 혹은 파일끝(=EOF)을 만날 때 까지, 해당 stream의 buffer에서 문자열을 읽어들인다. (개행(=newline)(='\n') 혹은 파
lumir.tistory.com
핵심 개념
숫자를 문자로 취급하여, 숫자를 문자열 배열상에 문자 형식으로 입력받아 풀면 쉽게 풀 수 있다.
문제 풀이
/* 선언 */
99999 이하의(최대 5자리) 정수가 입력으로 들어오므로, 배열의 길이는 최대 5로 잡으면 된다. 이때, '\n'과 '\0'이 들어오기 위해 2칸의 여유 공간이 필요하므로, 최종적으로 배열의 길이를 7로 선언하면 된다.
/* 팰린드롬 여부 판단 변수 선언 */
true, false 여부만 판단하면 되므로 bool형 변수로 선언하였다.
/* 문자열 입력받은 후, 개행문자 제거 */
fgets함수를 통해 입력된 개행문자를 제거한다.
/* 0값이 입력된 경우, 종료 */
0값이 입력된 경우, 반복문을 탈출한다.
/* 팰린드롬 여부 판단 */
'배열의 첫 번째 숫자와 마지막 숫자를 비교, 두 번째 숫자와 마지막에서 두 번째 숫자를 비교, ...' 하면서 배열의 마지막까지 비교를 반복해 나가면 된다. (이때, 연산 횟수를 줄이기 위해 배열의 중간까지만 비교를 수행하여도 상관없지만, 코드의 간단함을 위해 그냥 배열의 끝까지 비교를 진행하였다.)
3. 코드
#pragma warning(disable:4996)
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main(int argc, char* argv[]) {
/* 선언 */
char palin[7]; // '\0', '\n' 포함.
while (true) {
/* 팰린드롬 여부 판단 변수 선언 */
bool ispalin = true;
/* 문자열 입력 받은 후, 개행문자 제거 */
fgets(palin, sizeof(palin), stdin);
if (palin[strlen(palin) - 1] == '\n')
palin[strlen(palin) - 1] = '\0';
/* 0값이 입력된 경우, 종료 */
if (strlen(palin) == 1 && palin[0] == '0')
break;
/* 팰린드롬 여부 판단 */
for (int i = 0; i < strlen(palin); i++)
if (palin[i] != palin[strlen(palin) - 1 - i])
ispalin = false;
/* 출력 */
if (ispalin == false)
printf("no\n");
else if (ispalin == true)
printf("yes\n");
}
return 0;
}