알고리즘 및 코테/백준

백준 1110번: 더하기 사이클(Java)

성장코딩 2023. 1. 18. 14:56

https://www.acmicpc.net/problem/1110

 

1110번: 더하기 사이클

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,

www.acmicpc.net

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
 
        Scanner sc = new Scanner(System.in);
 
        int N = sc.nextInt(); // 26
        int Ncopy = N;
        boolean b = true;
        int cycle = 0;
 
        while (b) {
            cycle++;
            int n1 = N / 10// 2 이때 N은 26
            int n2 = N % 10// 6
            int n3 = (n1 + n2) % 10// 8
            N = 10 * n2 + n3; // 새로운 수(68)를 만들고 N에 대입(루프 돌면서 갱신하도록)
            if (Ncopy != N) {
                b = true;
            } else {
                break;
            }
        }
        System.out.println(cycle);
 
    }
}
cs

문제를 처음 풀었을 때 무한루프가 돌게 되어 그 원인을 찾는 데 고민이 되었던 문제

무엇을 잘못했는가?

 

연산을 통해 새로운 수를 만들었을 때, 이를 새로운 변수에 저장하는 순간! 무한루프가 발생했다. 

즉, 위 코드 18번째 라인N = 10 * n2 + n3부분에서

우측 항은 새로운 수를 만든 것이고 이를 좌측 항의 변수 N에 대입하고 있지만,

 

이를 자칫 새로운 수를 만든 것이니까 int Num = 10 * n2 + n3라고 놓고 Num과 N이 같은지를 비교해서 루프를 돌릴 생각을 하면 안된다. 

그렇게 되면 N은 영원히 처음 입력한 수 그대로 변함이 없고 아무리 루프를 돌려도 변화가 없기 때문이다. 

그래서 초기 N의 값을 저장할 변수 Ncopy를 만들어 이에 저장해놓고, 새로운 수를 만들어 낼 때마다 비교하면서 문제를 풀어나가면 될 것이다.

 

간단한 문제이지만, while문에 익숙하지 못한 스스로를 발견할 수 있었던 문제였다. 성장하자.