본문 바로가기

Coding Tests/백준 온라인

( C ) 백준온라인 - 1110번

<문제>

 

1110번: 더하기 사이클

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,

www.acmicpc.net

 

<정답 코드>

#include<stdio.h>
int main(void)
{
	int num;
	scanf("%d", &num);
	int mox, remainder,sum,num1;
	num1 = num;
	int i;
	for (i = 1; ; i++) {
		mox = num1 / 10; 
		remainder = num1 % 10;
		sum = (mox + remainder);
		num1 = remainder * 10 + sum%10;
		if (num == num1)
			break;
		else 
			continue;
	}
	printf("%d", i);
	return 0;
}

 

<문제 해결>

N이라는 수가 주어졌을 때, 문제의 조건에 따라 N의 사이클의 길이를 구하는 문제이다. 위 코드의 반복문 내에 있는 문장들이 문제에서 주어진 조건에 따라 사이클의 길이를 구하는 핵심과정이라 볼 수 있다. 

우선, num1과 num이 같다고 설정해준 이유는 사이클을 돌면서 입력되었던 수가 원래의 수로 돌아왔을 때 if문에서 break를 걸어주기 위함이다. 

 

26이라는 수가 주어졌다고 가정했을때 mox = 2, remainder = 6 , sum = 8이다. 그리고 num1 = 60 + 8이다.

그리고 if문에서 관계연산자(비교연산자) == 를 통해 num과 num1이 같은지를 비교하고 같다면 break문에 의해 반복문을 빠져나온다.

마지막에 i를 출력해줌으로써 사이클의 길이를 출력해준다.

 

i = 1일때 첫 사이클이고, i = 2일 때 입력된 수와 원래의 수가 같아진다면 break이고, 같지 않다면 continue문에 의해 다음 조건으로 넘어가게 된다. 만약 i = 3일 때 if문의 조건을 만족해 break가 된다면 i = 3일 때에도 사이클이 돈 것이므로 사이클의 길이는 당연히 3 이 된다.

 

<추가적으로..>

문제에서, 주어진 수가 10보다 작을 때는 앞에 0을 붙인다 하였는데, 처음에는 %02d를 사용하여야 하나라고 생각했었지만, 위 코드에서 mox과 sum의 연산과정을 보게 되면 일의 자리가 입력이 되면 mox에서 0이 나오고, sum연산에서 0+remainder가 되므로, %02d를 사용하지 않게 되었다. 그리고 %02d는 원하는 자릿수만큼 출력을 할 때 사용이 되므로 위 문제에서 사용하는 것은 옳지 않다.