문제
어떤 단어를 뒤에서부터 읽어도 똑같다면 그 단어를 팰린드롬이라고 한다. 'radar', 'sees'는 팰린드롬이다.
수도 팰린드롬으로 취급할 수 있다. 수의 숫자들을 뒤에서부터 읽어도 같다면 그 수는 팰린드롬수다. 121, 12421 등은 팰린드롬수다. 123, 1231은 뒤에서부터 읽으면 다르므로 팰린드롬수가 아니다. 또한 10도 팰린드롬수가 아닌데, 앞에 무의미한 0이 올 수 있다면 010이 되어 팰린드롬수로 취급할 수도 있지만, 특별히 이번 문제에서는 무의미한 0이 앞에 올 수 없다고 하자.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 1 이상 99999 이하의 정수가 주어진다. 입력의 마지막 줄에는 0이 주어지며, 이 줄은 문제에 포함되지 않는다.
출력
각 줄마다 주어진 수가 팰린드롬수면 'yes', 아니면 'no'를 출력한다.
구상
수를 입력받으면 그 수를 자릿수별로 쪼개서 배열1에 저장하고, 배열1을 역순으로 정렬해 배열2에 저장한다.
배열1과 배열2가 같으면 팰린드롬이고, 다르면 그렇지 않다.
우선 수를 쪼개서 배열1에 저장한다. 10으로 나눈 나머지는 배열에 입력되고 몫은 다음 반복을 위해 이용된다.
for (i = 0; n != 0; i++) { //숫자 단위별로 쪼개기
arr1[i] = n % 10;
n /= 10;
}
이제 배열1을 뒤집어 배열2에 넣으면 된다.
생각해봐야 하는 점은 배열이 비어 있으면 단순히 반복문으로 배열을 처음부터 끝까지 역순으로 정렬시킬 때 원하는 결과가 나오지 않는다는 점이다. 배열을 0으로 초기화하고 진행했기 때문이다.
예를 들어 수로 123을 입력하면 배열 1에 {1,2,3,0,0}이, 배열2에는 {0,0,3,2,1}이 들어간다.
[0] | [1] | [2] | [3] | [4] | |
arr1 | 1 | 2 | 3 | 0 | 0 |
arr2 | 0 | 0 | 3 | 2 | 1 |
우리는 뒤에 채워져 있는 무의미한 0을 무시하고, arr2가 {3,2,1,0,0}처럼 앞자리부터 채워지길 원한다.
[0] | [1] | [2] | [3] | [4] | |
arr2 | 3 | 2 | 1 | 0 | 0 |
위 반복문을 살펴보자. 입력한 수가 세 자리 수인데, for문은 n이 0이 아닐 때까지 반복하니 3번 실행되었고, i는 3으로 증가한 상태이다. 이 i를 이용해서 arr1의 마지막 요소에 접근하고, 마지막 요소가 저장된 위치부터 하나씩 arr2에 저장하면 문제를 해결할 수 있다.
j = i - 1; //arr1의 마지막 인덱스로 이동
i = 0;
for (j; j >= 0; j--) { //arr1을 역순으로 arr2에 저장
arr2[i] = arr1[j];
i++;
}
코드
#include <stdio.h>
int main(void)
{
//입력받는 수는 초기에 0이 아니게 설정, 반복변수 i와 j, 플래그
int n = 1, i, j, flag;
int arr1[5] = { 0 }, arr2[5] = { 0 };
while (true) {
scanf("%d", &n);
if (n == 0) break; //0이 입력되면 종료
flag = 1; //플래그 초기값은 1로 설정
for (i = 0; n != 0; i++) { //숫자 단위별로 쪼개기
arr1[i] = n % 10;
n /= 10;
}
j = i - 1; //arr1의 마지막 인덱스로 이동
i = 0;
for (j; j >= 0; j--) { //arr1을 역순으로 arr2에 저장
arr2[i] = arr1[j];
i++;
}
for (i = 0; i < 5; i++) //정배열과 역배열이 다르면 플래그 0
if (arr1[i] != arr2[i]) flag = 0;
if (flag) printf("yes\n");
else printf("no\n");
for (i = 0; i < 5; i++) { //반복시행을 위해 배열 초기화
arr1[i] = 0;
arr2[i] = 0;
}
}
return 0;
}
'프로그래밍 > Baekjoon' 카테고리의 다른 글
[C언어] 백준 9012. 괄호 (0) | 2022.11.09 |
---|---|
[C언어] 백준 1920. 수 찾기 (0) | 2022.11.04 |
[C언어] 백준 1181. 단어 정렬 (0) | 2022.11.01 |
[C언어] 백준 1018. 체스판 다시 칠하기 (1) | 2022.10.31 |
[C언어] 백준 5597. 과제 안 내신 분..? (0) | 2022.10.26 |