프로그래밍 언어/C

C언어 1065번 해설 한수

happy_life 2021. 9. 2. 18:15

https://www.acmicpc.net/problem/1065

 

1065번: 한수

어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나

www.acmicpc.net

 

문제

 

어떤 양의 정수 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