[Java] 백준 1110번

Input-1)
26
Output-1)
4
Input-2)
55
Output-2)
3
접근 방식
주어진 수를 N, 새로운 수를 T라고 가정하자.
N의 일의 자리가 T의 십의 자리수가 되고, N을 합한 수의 일의 자리가 T의 일의 자리수가 된다.
- N[0] + N[1] = T[ N[1] + (N[0]+N[1])[1] ]
N과 T의 자리수를 파악할 수 있게 2칸 크기의 문자열 배열을 통해 위 패턴을 구현하였다.
1
2
3
4
String n = br.readLine(); // 입력값
int first = Integer.parseInt(n); // 최초 입력 숫자 저장
String N[] = n.split(""); // 입력 숫자 배열
String T[] = n.split(""); // 입력 숫자 합 배열
또한 T를 만들려면 N의 합이 필요하기에 N의 합을 구한 뒤 sum(N의 합)이 10 보다 큰지 작은지 여부를 검증한 후 T의 자리수를 세팅하였다.
1
2
3
4
5
6
7
8
sum = Integer.parseInt(N[0]) + Integer.parseInt(N[1]);
if(sum >= 10) {
T[0] = N[1];
T[1] = String.valueOf(sum).split("")[1];
}else {
T[0] = N[1];
T[1] = String.valueOf(sum);
}
주어진 N의 값이 계속해서 새로운 T값으로 대체해줘야 하기에 T가 구해지면 N값으로 대체하도록 하였다.
1
2
N[0] = T[0];
N[1] = T[1];
결국 N의 정수값이 최초 입력받은 first값과 동일할 경우 반복문에서 탈출하도록 구현하였다.
1
if(Integer.parseInt(N[0])*10 + Integer.parseInt(N[1]) == first) break;
문제 해결
- N의 초기값이 10 이하인 수라면 반복문에서 예외가 발생한다.
N이 10 이하일 경우 앞에 “0”을 붙이도록 수정하였다.
1
if(Integer.parseInt(n) < 10) n = "0" + n;
작성코드
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
29
30
31
32
33
34
35
36
37
38
39
40
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String n = br.readLine();
int sum, cnt = 0;
int first = Integer.parseInt(n); // 최초 입력 숫자 저장
if(Integer.parseInt(n) < 10) n = "0" + n;
String N[] = n.split(""); // 입력 숫자 배열
String T[] = n.split(""); // 입력 숫자 합 배열
while (true) {
if(Integer.parseInt(n) == 0) {
cnt = 1;
break;
}
sum = Integer.parseInt(N[0]) + Integer.parseInt(N[1]);
if(sum >= 10) {
T[0] = N[1];
T[1] = String.valueOf(sum).split("")[1];
}else {
T[0] = N[1];
T[1] = String.valueOf(sum);
}
N[0] = T[0];
N[1] = T[1];
cnt += 1;
if(Integer.parseInt(N[0])*10 + Integer.parseInt(N[1]) == first) break;
}
bw.write(cnt + "\n");
bw.flush();
bw.close();
br.close();
}
}
회고
- 1110번 문제의 알고리즘 패턴의 경우 생각보다는 단순해보였는데, 실제로 해당 로직을 구현하고 보니, 더 좋은 패턴으로 풀 수 있었을 것 같다.
- 십의 자리수와 일의 자리수 조합을 아름답게 사용하면 코드길이를 대폭 줄일 수 있을 것 같다.