https://www.acmicpc.net/problem/1065
문제
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
풀이과정
문제 세분화
1)한수를 구하는 함수를 만든다.
-각 자리 수를 비교하니 10으로 나눈 나머지를 비교하기시도. % 사용
(i%10) - ((i/10)%10) != (j % 10) - ((j/10)%10)
▼
2) 배열의 한수 index에 1값을 넣는다
3) for 문을 통해 배열에 있는 1값이 들어있는 index의 개수를 세준다
▲이렇게 할 필요 X
핵심 idea
1~99는 모두 한수이므로 100~1000만 고려해주면 된다(1000은 당연히 아니므로 3자리 수의 각 자리를 비교해주면 된다)
따라서,
배열 index안하고 for 문으로 하나씩 조건에 맞는 것만 더해주면 한수의 개수를 도출 할 수 있음(자리값이 고정되
어있으므로 계산하기가 더 수월하다)
첫 코드(오답)
#include <stdio.h>
int han_num(i) { //한수 구하기 함수 생성
printf("수: %d\n", i);
int cnt = 0; //세 자리 수 중 한수 인것을 더해주기 위한 변수 선언
//세자리 수일 떄/ 아닐 때로 구분해주는 식
if (i < 100) {
return i;
}
else {
for (int j = 100; j <= i; j++) {
int hund = i / 100; //백의 자리
int ten = i / 10 % 10; //십 의 자리
int one = i % 10; //일의 자리
if (hund - ten == ten - one) {
++cnt;
}
}
return (99 + cnt);
}
}
int main()
{
int a;
a = han_num(210);
printf("한수의 개수 %d", a);
return 0;
}
105까진 잘 되다가 갑자기 210, 1000 대입 하니 안되서 문제를 고민해 보았다.
cnt에 문제가 생긴 것같아 체크해보았는데 아니나 다를까.
엥 cnt 가 111 이 나왔다.. 무슨일이지?? 일단 여기서 문제가 생겼으니
for (int j = 100; j <= i; j++) {
int hund = i / 100; //백의 자리
int ten = i / 10 % 10; //십 의 자리
int one = i % 10; //일의 자리
if (hund - ten == ten - one) {
++cnt;
}
▲이 코드에 문제가 생겼을 것이다. 거기에 더해 모든수가 count 되었다는 점에 주목해서 디버깅을 해보았다.
뭔가 모든 것이 카운트되었다는 점에서 하나의 숫자를 기준으로 판단이 되고 있는 것이 아닐까 생각이 들었었는데..
▼..
고정된 값인 i 를 기준으로 계속 세고 있었다. for 문이 돌아가면서 순차적으로 값이 들어가야하는데, i 라는 고정된 수로 하니 모두 cnt 되거나 cnt 되지 않은 것이었다.
▼정답 코드
#include <stdio.h>
int han_num(i) { //한수 구하기 함수 생성
printf("수: %d\n", i);
int cnt = 0; //세 자리 수 중 한수 인것을 더해주기 위한 변수 선언
//세자리 수일 떄/ 아닐 때로 구분해주는 식
if (i < 100) {
return i;
}
else {
for (int j = 100; j <= i; j++) {
int hund = j / 100; //백의 자리
int ten = j / 10 % 10; //십 의 자리
int one = j % 10; //일의 자리
if (hund - ten == ten - one) {
++cnt;
}
}
}
return (99 + cnt);
}
int main()
{
int input, res;
scanf("%d", &input);
res = han_num(input);
printf("%d", res);
return 0;
}
for 문 안에 있는 변수와 조건 변수를 같이 이용할 땐 둘이 일치하는 지 확인할 것.
해결과정이 맞은 것같다면, 고민하지말고 답지보고 대조하기. 시간낭비할 수 있음
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어 백준 10809 번 (2) | 2021.09.04 |
---|---|
C언어 백준 11720 해설 (1) | 2021.09.03 |
C언어 백준 4344번 해설 (0) | 2021.09.01 |
C언어 백준 8959번 (0) | 2021.09.01 |
C언어 백준 1546번 (0) | 2021.08.31 |