문제
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오. 첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.
학습
문제를 정확하게 이해하기 위해 예제로 주어진 입력과 출력을 살펴보았다. 예제 1번(110 -> 99)을 통해 100 미만의 수는 등차수열을 이루는 조건이 부족하므로 (예, 45, 56은 공차가 1로 판단) 전부 한수에 포함된다는 것을 알게되었다. 따라서 100미만의 수는 입력 N을 그대로 출력해준다.
입력받은 세자리 수 정수를 각각의 자리수로 분리하여 저장한 후 공차에 따라 cnt를 증가시킨 후 출력하면 되는 문제이다.
-
그러나 처음 짠 코드에는 우여곡절이 많았는데, 나는 먼저 배열로 도전해보았다. SIZE를 4로 지정한 뒤 각 자리수를 배열에 저장하고 그 뒤에 cnt를 증가시키도록 코드를 구현했는데 내가 간과한 몇 가지가 있었다. 백준(BOJ)멘토님이 지적해주셔서 알게된 부분이다.
int han(int _N) { int number[SIZE]; int cnt = 0, count = 0; int MAX; while (_N != 0) { number[count] = _N % 10; _N = _N / 10; count++; }//[0]=1의자리 [2]=100의자리 for (int i = 100; i <= _N; i++) { // 위에서 _N을 0으로 만들어버려서 의미가 없습니다. if (number[2]-number[1]==number[1]-number[0]) // 1000일 때 조심해야합니다. 1000을 number에 넣게 되면, cnt++; // number[0] = number[1] = number[2] = 0, number[3] = 1 } // 이 되므로 1000까지 카운트 되버립니다. return (99 + cnt); } // N보다 작은 모든 수에 대해 조사해야합니다. 루프를 어디서 시작해야할 지 조금 더 생각해주세요!
1. han함수에 대한 질문이였는데, 정수를 분리하는 과정에서 입력 _N을통해 분리했으므로 _N은 0이 되었다. 그러므로 당연히 for 반복문에서 오류가 난다.
2. 배열을 통해 저장할 때, 입력의 범위가 1000 이하이므로 1000이 입력되면 백의자리 = 0 십의자리 = 0 일의자리 = 0이 되므로 한수로 판별된다. 그러나 1000은 한수가 아니다. 이 부분이 오류이다.
3. for 반복문 밖에서 변수들을 초기화시켰다는 점에서 오류가 발생한다.
아래는 오류들을 모두 수정한 새로운 코드이다.
코드
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void HAN(int _N) { if (_N < 100) printf("%d", _N); else { int i; int cnt = 99; int hun, ten, one; //A는 100의자리 B는 10의자리 C는 1의자리 for (i = 100; i <= _N; i++) { hun = i / 100; ten = i / 10 % 10; one = i % 10; if ((one - ten) == (ten - hun)) cnt++; } printf("%d", cnt); } } int main() { int N; scanf("%d", &N); HAN(N); }
출처
함수도 끝!
'프로그래밍 > C, C++' 카테고리의 다른 글
[C] 백준 2750 수 정렬하기 (0) | 2021.07.05 |
---|---|
[C] 백준 7568 덩치 (0) | 2021.05.03 |
[C] 동아리 5주차 활동 (정수의 자리수 분리) (0) | 2021.04.09 |
[C] 정수의 자리수 분리 (0) | 2021.04.08 |
[C] 백준 4949 균형잡힌세상 ⚖ (0) | 2021.04.08 |