백준의 한수(1065) 문제이다.
( 문제 바로가기 )
[ 문제설명 ]
- 한수라는 것은 각 자리가 등차수열을 이루는 수를 말한다. 즉 123 같은 경우, 1 -> 2(+1) -> 3(+1) 이런 식으로 등비가 같은 경우
이 수를 한수라고 한다.
- 이 때, 입력으로 주어지는 N보다 작거나 같은 한수의 갯수를 출력하면 된다.
[ 문제풀이 ]
1. 먼저 1부터 생각해보자. 1은 한수일까? 한수이다. 2는 ? 한수이다. 3은? 한수이다. 모든 한자리 숫자는 한수이다.
2. 그렇다면 15는 한수일까? 한수이다. 24는? 한수이다. 82는? 한수이다. 99는 ? 한수이다. 즉, 모든 두자리 숫자는 한수이다.
3. 위에서 말한것과 같이 한 자리 숫자와 두 자리 숫자는 모두 한수이기 때문에 만약 입력으로 주어지는 N의 값이
100보다 작다면, 답은 N일 것이다. 문제는 세자리 수이다.
- 입력의 최댓값이 1000인데 그렇다면 네자리 수도 고려해야 되는거 아닐까? 최댓값이 1000이다. 1000은 한수가 아니다.
즉, 네자리 수는 고려해야 할 필요가 없다.
4. 먼저 나는 각 자리수를 저장할 배열을 하나 사용하였다. 123이라는 숫자가 있으면, 각 자리수를 10으로 나눈 나머지와 저 값을
10으로 나눈 값을 반복문을 통해서 각 자리수를 저장해 주었고, 그 자리수의 차이가 일정한지 확인하였다.
5. 여기서 주의해야 할 것이 N이 100이상이라면, 정답에 99를 더해주어야 한다. 왜냐하면 1~99는 한수이기 때문이다.
[ 소스코드 ]
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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #include<iostream> #define endl "\n" using namespace std; int N; int Arr[4]; void Input() { cin >> N; } void Solution() { int Answer = 0; if (N < 100) { cout << N << endl; return; } else { Answer = 99; for (int i = 100; i <= N; i++) { if (i == 1000) break; int Idx = 0; int Tmp = i; while (Tmp > 0) { Arr[Idx] = Tmp % 10; Tmp = Tmp / 10; Idx++; } if (Arr[0] - Arr[1] == Arr[1] - Arr[2]) Answer++; } } cout << Answer << endl; } void Solve() { Input(); Solution(); } int main(void) { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen("Input.txt", "r", stdin); Solve(); return 0; } | cs |
'[ BOJ Code ] > # BOJ -' 카테고리의 다른 글
[ 백준 3019 ] 테트리스 (C++) (0) | 2018.12.12 |
---|---|
[ 백준 2210 ] 숫자판 점프 (C++) (2) | 2018.12.12 |
[ 백준 15686 ] 치킨배달 (C++) (0) | 2018.12.12 |
[ 백준 14890 ] 경사로 (C++) (4) | 2018.12.10 |
[ 백준 1600 ] 말이 되고픈 원숭이 (C++) (7) | 2018.12.10 |