[BOJ][C] 1110번 더하기 사이클

안녕하세요.

오늘은 백준 1110번: 더하기 사이클(링크)  문제를 풀어보려고 합니다.

 

문제

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.
26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.
위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.
N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.

 

출력

첫째 줄에 N의 사이클 길이를 출력한다.

 

예제 입력

26
51
1
0
71

 

예제 출력

4
3
60
1
12

 

제한

시간 제한: 2

메모리 제한: 128MB

 


풀이

문제에서 한 자리 숫자는 두 자리 숫자로 만들어 주므로 두 자리 숫자의 경우만 생각해주면 됩니다.

 

먼저 입력받은 수가 10보다 작다면 앞에 0을 붙여 두 자리 숫자를 만들어 주라고 했습니다.

예를 들어 6을 입력하면 06으로 만들어주라는 뜻입니다.

하지만 이 문제에선 굳이 0을 붙이는 과정을 생각하지 않고 밑의 과정을 진행하면 됩니다.

이는 사이클 숫자 만드는 과정을 살펴보며 확인을 해보겠습니다.

 

두 자리 숫자의 경우

십의자리 숫자와 일의자리 숫자를 더한 후 일의자리 숫자 * 10 + 더한 값의 일의 자리 숫자를 해주면 다음 사이클 숫자로 가죠.

 

각 자리의 숫자는 어떻게 구할까요? 나머지 연산(%)과 나누기 연산(/)을 적절히 사용하면 됩니다.

 

십의 자리 숫자는 숫자/10, 일의 자리 숫자는 숫자%10로 구할 수 있습니다.

 

그 후 구한 숫자들을 이용해 다음 사이클 숫자를 만든 후, 길이를 1 증가시킵니다.

 

정리해보면 n = (n % 10 * 10) + ((n / 10) + (n % 10))%10 와 같이 나타낼 수 있습니다.

 

위의 과정을 원래 숫자로 돌아올 때까지 반복하고 사이클 길이를 출력하면 됩니다.

 

한 자리 숫자의 경우에도 그대로 적용하면 앞에 0을 붙이나 안 붙이나 같은 결과가 나옵니다.

 

앞에 0 붙인 경우:

06 -> 0/10 = 0, 6%10 = 6 -> 66

 

앞에 0 안붙인 경우

6 -> 6/10 = 0(0.6666), 6%10 = 6 -> 66

 

정답

더보기
#include <stdio.h>

int main(void)
{
	int n, on, count = 0;;
	scanf("%d", &n);
	on = n;
	while (1)
	{
		n = (n % 10 * 10) + ((n / 10) + (n % 10))%10;
		count++;
		if (n == on)
			break;
	}
	printf("%d", count);
	return 0;
}

 


문제에서는 두 자리 숫자인 경우 각 자리 숫자를 구했는데, 만약 세 자리 이상이라면 각 자리 숫자를 어떻게 구할까요?

 

세 자리 이상인 경우

세 자리 이상의 숫자는 일의 자리 숫자부터 구하는 방법으로 진행합니다.

 

1. 먼저 숫자%10로 일의 자리 숫자를 구합니다.

2. 그 다음 숫자 /= 10을 해주어 자리 수를 하나 줄입니다.

3. 1,2번 과정을 숫자가 0이 될 때까지 반복합니다.

 

123을 예로 들면

 

123%10 = 3, 123 /= 10 --> 12

12%10 = 2, 12 /= 10 --> 1

1%10 = 1, 1 /= 10 --> 0

 

즉 일의 자리 숫자 3, 십의 자리 숫자 2, 백의 자리 숫자 1이 나오는 것을 볼 수 있습니다.

백의 자리 숫자는 숫자/100을 해주면 나오겠죠? 일의 자리숫자도 숫자%10하면 나옵니다.

 

이를 코드로 정리해서 나타내면 다음과 같습니다.

 

#include <iostream>
using namespace std;

int main(void)
{
	int n;
	scanf("%d", &n);
	while(n!=0)
	{
            printf("%d\n",n%10);
            n /= 10;
	}
	return 0;
}

이렇게 해서 백준 1110번 더하기 사이클 문제를 풀어보았습니다.

 

댓글로 질문을 남기시면 성실히 답해드리겠습니다

 

감사합니다!

'PS > 백준 문제' 카테고리의 다른 글

[BOJ][C] 1310번 그룹 단어 체커  (0) 2022.11.08
[BOJ][C] 1065번 한수  (0) 2022.11.07
[BOJ][C] 4673번 셀프 넘버  (0) 2022.11.06
[BOJ][C] 2884번 알람시계  (1) 2020.02.10
[BOJ][C] 10171번 고양이  (1) 2019.12.21