⌨️CS-PS/백준_문자열

[Baekjoon/백준][1259][C/C++] 팰린드롬수

미르의 블로그 2023. 2. 8. 10:00
728x90
반응형
『목차』
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함수의 사용방법을 익힌 후 풀어야 헤매지 않고 풀 수 있다. 아래 링크를 참조하자.

https://lumir.tistory.com/31

 

[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;
}
728x90
반응형