알고리즘 및 코테/백준
백준 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문에 익숙하지 못한 스스로를 발견할 수 있었던 문제였다. 성장하자.