스파르타 알고리즘 트랙 문제 2일차 - 3 #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의 사이클의 길이를 구하는 프로그램을 작성하시오.
해결 과정
다음 수의 10의 자리 수는 이전 수를 10으로 나눈 나머지, 다음 수의 1의 자리 수는 이전 수를 10으로 나눈 나머지와 몫의 합으로 표현할 수 있다. 그렇기에 N과 사이클을 돌린 새로운 수가 동일해 질 때까지 위의 계산을 반복하면 간단하게 문제를 해결할 수 있을 것이다.
import java.util.Scanner; public class Main { public static void main(String[] args) { int check = 0; Scanner a = new Scanner(System.in); int N = a.nextInt(); int number = N; int next; check++; next = number%10+number/10; number = number%10*10 + next%10; while (number != N) { check++; next = number%10+number/10; number = number%10*10 + next%10; } System.out.println(check); } } |
처음에는 While의 조건을 true로 설정하고, number와 N이 동일할 때 반복문을 탈출하는 형태로 구현하려 했으나, 반복문을 탈출하는 조건에 true를 설정했었을 때 런타임 에러를 보여주었던 과거가 떠올랐고, number와 N이 같지 않을 때의 조건을 넣는 것이 더 아름다운 조건으로 보여 그 조건을 넣었다.
다만 변수 number를 처음에 N에 할당하게 되다 보니, while문 밖에서 따로 한 번 계산하여 number와 N의 값을 다르게 만든 후 while문을 실행하는 조치가 필요했다.
어려운 조건이나 수학적 계산이 들어가지 않은 만큼, 큰 무리 없이 정상 표기를 받을 수 있었다.