https://www.acmicpc.net/problem/1065
임의의 자연수에서 각 자리의 수가 등차수열을 이루면 그 수를 한수라고 한다.
쉽게 말해서 각 자리 수의 차이가 같으면 한 수이고 하나라도 다르면 한수가 아니다.
주어진 예제를 좀 더 분석해보자.
입력이 110일 때 출력이 99이다. 도대체 무슨 의미일까?
우선 100~110이 한수인지 여부를 알아봐야 한다.
100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110
공교롭게도 100~110은 한수가 아니다.
다시 말해 1~99는 한수라는 뜻이다.
N보다 작은 한수를 세기 위해 1~99까지 수는 셀 필요가 없다.
N이 100보다 작고 100보다 작은 수는 한수이기 때문에 N이 곧 한수의 갯수가 될 것이고
N이 100보다 크다면 99를 미리 세어놓고 100부터 한수인 것을 세면 된다.
한수인지 여부를 판별하는 함수는 쉽게 만들 수 있다.
각 자리수를 떼어내 배열에 저장해두고 각 자리 수의 차이를 이전 차이, 현재 차이로 저장한다.
이전 차이와 현재 차이를 구하는 도중에 이전 차이와 현재 차이가 달라지는 경우 한수가 아니다.
끝까지 이전 차이와 현재 차이가 다르지 않다면 한수이다.
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include<stdio.h> #define TRUE 1 #define FALSE 0 int isHansu(int n) { int count = 0; int digit[4]; int previousDiffer; int currentDiffer; while (n>0) { digit[count++] = n % 10; n /= 10; } previousDiffer = digit[1] - digit[0]; for (int i = 1; i < count - 1;i++) { currentDiffer = digit[i + 1] - digit[i]; if (currentDiffer != previousDiffer) { return FALSE; } previousDiffer = currentDiffer; } return TRUE; } int main() { int N; int count = 0; scanf("%d",&N); if (N<100) { count = N; } else { count += 99; for (int i = 100; i <= N;i++) { count += isHansu(i); } } printf("%d\n",count); return 0; } | cs |
'백준' 카테고리의 다른 글
2920)음계 (0) | 2019.01.15 |
---|---|
8958)OX 퀴즈 (0) | 2019.01.15 |
1012)유기농 배추 (0) | 2019.01.13 |
4673)셀프 넘버 (0) | 2019.01.12 |
2839)설탕 배달 (0) | 2019.01.10 |