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
4
55
3
#include<stdio.h>
int main() {
int N, A, B, C, D;
int result;
int cnt=0;
scanf("%d", &N);
result = N;
while (1) {
A = N / 10;
B = N % 10;
C = (A + B) % 10;
D = (B * 10) + C;
N = D;
cnt++;
if (D == result)
break;
}
printf("%d", cnt);
}
이 문제 보고 이해를 위해 필기하며 어떻게 풀 지 생각해봤다.
첫째자리와 둘째자리를 구하는 방법은 아는데 그 후에 어떤식으로 코드를 짤지 감을 못 잡았다.
그래서 아예 변수를 여러개 만들고, 단계별로 나눠 풀어보자!하고 나온 풀이이다.
먼저, while문을 사용해서 입력한 N (ex: 26)과 같아질 때까지 반복했다.
result변수에 처음 입력한 N을 넣어주고, A부터 D까지 변수를 선언했다.
A에는 입력한 N의 왼쪽자리 (ex: 2), B에는 N의 오른쪽자리 (ex: 6) 숫자를 대입했다.
C에는 A+B값의 나머지값 (ex: (2+6)%10=8)을 넣어준다. 즉, A+B값을 넣어주는 것인데, %를 붙인 이유는 10이상이 되면 1의자리를 C에 넣으려는 것이다.
D에는 (Bx10)+C (ex: (6x10)+8=68)를 해줘서 새로운 숫자를 만들고, N에 대입한다.
다시 처음으로 돌아가서 68을 같은 단계를 거쳐 새로운 숫자로 만든다.
cnt변수를 만들어서 반복한 횟수를 넣어주고, 처음 입력한 숫자 result와 새로 만들어진 숫자 D가 같아지면 while문을 종료하도록 했다.