Tech Blog of Pinomaker
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 메서드에 입력 받은 값을 전달하여 실행한다.

<java />
// 메인 메서드 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의 정수를 입력 받는다.

<java />
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을 나누면 십의 자리의 숫자가 된다.

<java />
// 두 자릿수의 각 자릿값 구하기 // 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

<java />
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문을 사용했다.

이것을 계속 반복하면 결과가 잘 나온다.

 

1. [코드]

<java />
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); } } }
profile

Tech Blog of Pinomaker

@pinomaker

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!