0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다.
먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다.
그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다.
다음 예를 보자.
26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.
위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.
N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.
해당 문제를 봤을 때 금방 할 줄 알았는 데, 은근 자잘한 실수를 많이 해서 나름 조금 걸렸다.
먼저 메인 메서드에서 스캐너를 이용해서 사용자의 입력 값을 받는 데, 0 - 99의 정수가 아니라면, 프로그램을 종료 시켰다.
0 - 99의 값을 입력 한다면, cycle 메서드에 입력 받은 값을 전달하여 실행한다.
// 메인 메서드
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
if(num<0 || num > 99){
System.out.println("다시 입력하세요. 숫자가 0보다 작거나 99보다 큽니다.");
} else{
cycle(num);
}
}
메서드 cycle은 사용자가 입력한 0 - 99의 정수를 입력 받는다.
public static void cycle(int start){
int a, b, value;
if(start < 10){
b = start;
a = 0;
} else{
b = start % 10;
a = (start - b)/10;
}
value = a + b ;
System.out.println(a + "+" + b + "=" + value);
for (int i = 1; i > 0; i++) {
if(start == b * 10 + value){
System.out.println("Cycle : " + i);
break;
}
a = b;
if(value > 9) value = value % 10;
b = value;
value = a + b;
System.out.println(a + "+" + b + "=" + value);
}
}
먼저 덧셈을 진행할 항과 값을 a + b = value로 사용하기 위해 변수로 선언했고, 조건에 사용자의 입력 값이 10보다 작을 경우에는 숫자 앞에 0을 붙이라는 조건이 있기에, if문을 활용하여 10보다 작은 경우와 아닌 경우로 분기 처리를 해 a와 b에 값을 대입 하였다.
10보다 작은 5를 입력 받으면 05라고 생각하고, 0 + 5 = 5라는 구조를 만들기 위해, a에는 0을, b에는 초기 값을 대입하고, 10보다 작지 않다면, 각 자릿수를 구한다.
나머지 연산자로, 두 자리 숫자에 10을 나눈 값의 나머지는 1의 자리수가 되고, 숫자에 방금 나온 나머지를 빼고 10을 나누면 십의 자리의 숫자가 된다.
// 두 자릿수의 각 자릿값 구하기
// 25를 입력 받으면, 2와 5로
int num = 25
int b = num % 10; // b = 5
int a = (num - a)/10; // a = 2
for문을 이용해서 입력 받은 값이 나오기 전까지 전까지 반복하는 코드를 짰다.
26일 경우 2 + 6 = 8 새로운 수 68, 6 + 8 = 14 새로운 수 84 ... 이와 같이 새로운 수와 입력 받은 수가 같아야 반복문이 끝나고 반복 횟수를 출력하면 되는 데, 새로운 수는 연산에서 사용하지 않기에, 변수로 선언하지 않고, 식으로 표현해서 앞에서 각자리수를 구한 것처럼 각 자리수로 새로운 수를 만들어 조건문을 사용 했다.
ex) a = 2, b = 6 -> a * 10 + b -> 26
if(start == b * 10 + value){
System.out.println("Cycle : " + i);
break;
}
그리고 a + b = value라면, 다음 식은 b + value의 1의 자리수가 되어야하기에, a에는 b를, b에는 value를 대입한다.
이 때 value가 10이상이라면, 1의 자리수를 이용하라는 조건이 있기에 if문을 사용했다.
이것을 계속 반복하면 결과가 잘 나온다.
[코드]
import java.util.Scanner;
public class NumberCycle {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
if(num<0 || num > 99){
System.out.println("다시 입력하세요. 숫자가 0보다 작거나 99보다 큽니다.");
} else{
cycle(num);
}
}
public static void cycle(int start){
int a, b, value;
if(start < 10){
b = start;
a = 0;
} else{
b = start % 10;
a = (start - b)/10;
}
value = a + b ;
System.out.println(a + "+" + b + "=" + value);
for (int i = 1; i > 0; i++) {
if(start == b * 10 + value){
System.out.println("Cycle : " + i);
break;
}
a = b;
if(value > 9) value = value % 10;
b = value;
value = a + b;
System.out.println(a + "+" + b + "=" + value);
}
}
}
'CS > 알고리즘 문제' 카테고리의 다른 글
[백준 - 1712] 손익 분기점 (0) | 2022.08.29 |
---|---|
[백준 - 13458] 시험 감독 (0) | 2022.08.28 |
[백준 - 4344] 평균은 넘겠지(배열 응용) (0) | 2022.08.26 |
[백준 - 2480] 3개의 주사위 게임 (0) | 2022.08.26 |