-해법
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt(); // 사이클 수를 구할 정수
int cycle = 0; // 사이클 수 저장 변수
int v_n = -1; // 사이클 과정에서 변하는 정수들을 저장할 변수
int temp =n; // 변하는 정수를 임시로 저장해 연산에 사용할 변수
while(n!=v_n){ // 변한 정수와 최초 정수가 일치하지 않을 경우 반복 수행
v_n = temp/10 + temp%10; // 정수의 각 자리수를 더함
if(v_n>=10) { // 더한 결과가 10 이상일 경우 1의 자리만 저장한다.
v_n = v_n%10;
}
v_n+= temp%10 *10; // 앞선 정수의 1의 자리 수를 10의 자리 수로 만든 뒤 합쳐준다.
temp = v_n; // 바뀐 정수를 다음 연산을 위해 temp에 저장
cycle++; // 여기까지 cycle 1번
}
System.out.println(cycle);
}
}
풀이가 좀 복잡하기는 한데 잘 생각해보면 크게 어렵지 않다. 위의 코드를 26이 입력됐다고 가정하고 작동 순서대로 살펴보자.
n (비교를 위한 고정된 입력값) |
cycle | v_n | temp |
26 | 0 | -1 | 26 |
26 | 1 | 68 | 68 |
26 | 2 | 84 | 84 |
26 | 3 | 42 | 42 |
26 | 4 | 26 | 26 |
Cycle 0#
- 입력받은 n을 연산에 사용하기 위해 temp에 저장한다.
- v_n이 -1인 이유는 반복문에 진입하기 위해서이며, 0으로 설정하지 않은 이유는 n의 입력이 0일 경우 진입하지 못하기 때문이다. (n의 입력 범위가 0~99이므로 이 범위에 속하지 않게만 설정해주면 된다.)
- n!= v_n이므로 반복문에 진입
Cycle 1#
- 연산에 사용하기 위해 temp에 저장된 값의 각 자릿수를 뽑아낸 뒤 더해준다.
- 더한 결과가 10 이상일 경우 1의 자리만 취하기 위한 조건문을 한 번 거친다. (26은 8이므로 무시)
- 더한 결과(8)이 1의 자리 수가 되고 앞선 수의 1의 자리 수가(6) 10의 자리 수가(60) 돼야 하므로 다시 한번 자리 수를 추출한 뒤 *10을 수행 (60 + 8 =68)
- 다음 연산이 존재할 수 있기 때문에 temp에 값을 임시 저장한다.
- cycle이 +1 된 후 다시 while문의 조건 확인, 만족하면 cycle을 출력하고 만족하지 않으면 다시 반복한다.(26!= 68이므로 다시 반복)
Cycle 2# ( 이 과정부터는 위의 Cycle 1#의 반복)
- 앞선 과정으로 temp에 저장된 68의 각 자릿수를 추출한 뒤 더해준다. (6 + 8 = 14)
- 14는 10이상이므로 조건문을 통해 4만 취해준다.
- temp의 1의 자리 수를 10의 자리로 만든다. (8 * 10 = 80)
- 10의 자리 수와 1의 자리 수를 더해준다. (80 + 4 = 84)
- 다시 다음 연산이 존재할 수 있기 때문에 temp에 84를 임시 저장한다.
- cycle +1 후 while문의 조건문 판단을 수행한다.
Cycle 3#
- temp에 저장된 84의 각 자리 수를 추출한 뒤 더해준다. ( 8 + 4 = 12)
- 12는 10 이상이므로 조건문을 통해 2만 취해준다.
- temp의 1의 자리 수를 10의 자리로 만든다. (4 * 10 = 40)
- 10의 자리 수와 1의 자리 수를 더해준다. (40 + 2 = 42)
- 다음 연산이 존재할 수 있기 때문에 temp에 42를 임시 저장한다.
- cycle + 1후 while문의 조건문 판단을 수행한다.
Cycle 4#
- temp에 저장된 42의 각 자릿수를 추출한 뒤 더해준다. ( 4 + 2 = 6)
- 6은 10 이상이 아니므로 조건문을 무시한다.
- temp의 1의 자리 수를 10의 자리로 만든다. (2 * 10 = 20)
- 10의 자리 수와 1의 자리 수를 더해준다. (20 + 6 = 26)
- 다음 연산이 존재할 수 있기 때문에 temp에 42를 임시 저장한다.
- cycle + 1후 while문의 조건문 판단을 수행한다.
- v_n이 26이고 n이 26이므로 조건문을 벗어난다.
- cycle 수를 출력한다.
복잡하다... 이 풀이를 그대로 따라 하기보다 큰 틀을 이해하고 자신만의 방법으로 풀어보는 것을 추천한다.