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

// 메인 메서드
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);
        }
    }
}
profile

Tech Blog of Pinomaker

@pinomaker

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