https://www.acmicpc.net/problem/1110
1110번: 더하기 사이클
0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,
www.acmicpc.net
import java.util.Scanner;
public class Main {
private static int newNum(int num) {
int x = num % 10; //1의 자리
int y = num / 10; //1의 자리 제거(10의 자리)
int z = (y + x) % 10; //더한 값의 1의 자리
return (x * 10) + z;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int firstNum = num;
int count = 0;
do {
num = newNum(num);
count++;
}while(num != firstNum);
System.out.println(count);
}
}
이 문제를 읽었을 때 난 두 가지를 간과했다.
그 중 하나는 자릿수를 구하는 방법이다.
처음에는 valueOf로 문자열로 만든 뒤 charAt 메서드를 통해 자릿값을 구하려고 했다. 그러다보니 코드는 엄청나게 길어지고 어느덧 떠오른게 저 방법이다. 모듈러 연산과 나눗셈으로 아주 쉽게 자릿수를 구했다.
두번째로는 새로운 수를 구하는 로직의 모듈화다.
해당 로직을 모듈화로 구했다 가정하고 문제를 풀었다면 좀 더 쉽게 접근이 가능했을 것이다.
덧붙여 처음에는 while(true)와 같이 무한루프를 돌면서 탈출조건일 때 break하도록 만들었다.
비교하는 두 값이 맨 처음에는 같기 때문이었다. 이에 따라 if문이 맘에 안들어 어떻게든 제거하려했고 그래서 do~while을 사용했다.
참고로 여기에서 더 빠른 로직을 원한다면 Scanner 대신 BufferedReader를 sout 대신 PrintWriter를 사용하면 된다.
'Java > Problem Solving' 카테고리의 다른 글
BOJ 1316번 - 그룹 단어 체커 (4) | 2022.06.19 |
---|---|
BOJ 4673번 - 셀프넘버 (0) | 2022.06.14 |
BOJ 2577번 - 숫자의 개수 (0) | 2022.06.12 |