<문제>
<정답 코드>
#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는 원하는 자릿수만큼 출력을 할 때 사용이 되므로 위 문제에서 사용하는 것은 옳지 않다.