https://www.acmicpc.net/problem/1065
1065번: 한수
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나
www.acmicpc.net
1065번: 한수 - C언어 풀이
[문제]
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
[입력]
첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.
110
|
210
|
1000
|
[출력]
첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.
99
|
105
|
144
|
[소스코드]
#include <stdio.h>
// [baekjoon] 1065번 - 한수
int hansu(int n) {
int arr[4] = { 0 };
int i = 0;
while (n > 0) { // 입력받은 숫자의 각 자리수를 배열에 대입
arr[i] = n % 10;
n /= 10;
i++;
}
switch (i) {
case 1: case 2: // 2자리수 이하일때는 무조건 한수
return 1; // 한수이면 1 반환
case 3: // 3자리수 일때 한수여부 판단
if (arr[1] - arr[0] == arr[2] - arr[1]) return 1; // 각 자리수의 차가 같으면 1 반환 (한수)
else return 0; // 같지 않으면 0 반환 (한수x)
default: // 4자리수 (=1000)일때는 한수가 아님
return 0; // 한수가 아니면 1 반환
}
}
int main() {
int n, sum = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
sum += hansu(i);
}
printf("%d\n", sum);
}
문제에서 중요한 건 '한수'가 무엇인지 파악하는 건데,
한수는 각 자리가 등차수열을 이루는 수, 즉 각 자리수들의 차가 일정한 차이를 보이는 수다.
문제만 읽고 나면 한 자릿수, 두 자릿수는 어떻게 되나 알기 어려웠는데,
한 자릿수와 두 자릿수는 모두 한수이다.
입출력 예시에서 110을 입력했을 때 99가 나오는 것을 보면 확인할 수 있다. (101~110에는 한수가 없으니까)
입력받을 자연수의 최댓값은 1000인데, 1000은 한수가 아니므로
결과적으로 세 자릿수만 한수인지 판별하는 코드를 작성하면 된다.
정수를 받아서 한수 여부를 판별하는 함수 hansu를 만들어서 문제를 해결해봤다.
정수를 자리수 별로 분리해서 배열 arr에 저장했고, 나눈 횟수를 통해 해당 정수의 자리수도 확인했다.
작성한 코드는 영 깔끔하지 못하다.
case 문을 써보고 싶어서 썼는데, if 문으로 작성해도 충분해 보인다.
'학습 정리 > 👨💻 PS Study' 카테고리의 다른 글
[C] 백준 11557번 - Yangjojang of The Year (0) | 2022.07.06 |
---|---|
[C] 백준 21866번 - 추첨을 통해 커피를 받자 (0) | 2022.07.06 |
[C] 백준 1924번 - 2007년 (0) | 2022.07.06 |
[C] 백준 8958번 - OX퀴즈 (0) | 2022.06.22 |
[C] 백준 4673번 - 셀프 넘버 (0) | 2022.06.22 |