[백준] 1065 - 한수



문제 풀이 정보




문제

어떤 양의 정수 X의 자리수가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.

첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.

첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.



작성한 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>

int check(int num) {
int i, count=0;

for (i=1; i<=num; i++) {
if (i < 100)
count++;
else if (i >= 100 && i < 1000) {
if ((i/10 - 10*(i/100) - i/100) == (i%10 - (i/10 - 10*(i/100))))
count++;
}
}

return count;
}

int main() {
int n;

scanf("%d", &n);
printf("%d", check(n));

return 0;
}



출력 결과




메모

이 문제는 바로 직전에 풀었던 ‘셀프 넘버’와 유사한 고민을 하게 만들었던 문제였다. 문제 분류가 함수로 되어 있어서 메인에서는 함수를 이용하여 프로그램이 동작하도록 구현하였다. 우선, 입력할 자연수를 나타내기 위해 정수형 변수 n을 선언한 후 값을 받아왔다. 그런 다음 함수에서 받아온 값을 이용하여 결과를 출력하도록 하였는데 함수의 구조는 다음과 같다. 함수 check는 입력받은 자연수 값을 가져와 그 값만큼 for문을 돌며 값을 비교하고, count라는 정수형 변수를 반환하도록 되어 있다. for문을 돌리기 위해 임시 정수형 변수 i를 선언하였고, 내부에서는 자리수에 따라 비교를 진행한다.

우선, 1부터 99까지의 숫자는 어떠한 숫자가 나오더라도 모두 등차수열에 해당하는 값이기 때문에 모두 count 값을 증가시켜주고, 100자리 숫자가 나오는 경우, 각 자리수의 형태가 등차수열을 갖추게 되는 경우를 수식으로 확인해보았다. 100자리 수가 들어왔을 때, 10의 자리에서 100의 자리 수를 뺀 값과 1의 자리에서 10의 자리 수를 뺀 값이 같은 경우에 count를 증가시켜 주었다. 자세한 계산 방법을 생각해보면 (원래 값을 10으로 나눈 값 - 원래 값을 100으로 나눈 값에 10을 곱한 값 - 원래 값을 100으로 나눈 값)과 (원래 값을 10으로 나눈 나머지 - (원래 값을 10으로 나눈 값 - 원래 값을 100으로 나눈 값에 10을 곱한 값))을 비교하는 것이다.

예를 들면, 468이라는 수가 입력 되었을 때, ① 원래 값을 10으로 나눈 값 : 46 - ② 원래 값을 100으로 나눈 값에 10을 곱한 값 : 4 * 10 = 40 - ③ 원래 값을 100으로 나눈 값 : 4, 즉, 46 - 40 - 4 = 2임을 통해 비교 식의 앞 부분 내용을 확인할 수 있고, ④ 원래 값을 10으로 나눈 나머지 : 8 - (⑤ 원래 값을 10으로 나눈 값 : 46 - ⑥ 원래 값을 100으로 나눈 값에 10을 곱한 값 : 4 * 10 = 40), 즉, 8 - (46 - 40) = 2임을 통해 비교 식의 뒷 부분 내용을 확인할 수 있다. 결과적으로 왼쪽 식의 값과 오른쪽 식의 값이 같기 때문에 등차수열임을 확인할 수 있으며, 만약 각 자리수가 등차수열을 이루는 수가 아니라면 서로 다른 값이 나올 것이다. 이것이 성립되는 경우 count를 증가시키고 마지막에 count 값을 반환하여 한수의 개수를 확인할 수 있었다.

셀프 넘버와 푸는 방식이 얼추 비슷한 느낌이어서 푸는데 큰 어려움은 없었지만 수식을 입력할 때 괄호의 위치를 정확하게 두지 않아서 계산이 제대로 되지 않는 현상이 발생되기도 하였다. 그 부분은 마지막까지 고민하여 수정하였고, 이 문제에서 혼동을 겪었던 부분은 등차수열에 대한 개념적인 부분이었다. 사실 실제 등차수열은 두 개 이상의 수가 존재할 때, 공차가 0이 아니면서 일정한 수로 점점 증가하는 형태의 모습을 생각하고 있었는데 막상 문제를 풀 때 보니 110까지의 입력 조건에서 99개의 답이 나오는 것을 보고 1에서 9까지의 숫자가 포함 될 수 있다는 점, 그리고 11이나 22와 같이 공차가 0임에도 불구하고 인정이 된다는 점을 보고 문제에 대한 접근을 달리해서 생각해 보았던 것 같다.

Author

Alec J

Posted on

2018-04-06

Updated on

2021-02-09

Licensed under