문제 풀이/[JAVA_자바] 백준

[JAVA / 자바] 백준 1110번 - 더하기 사이클

Seunghyun_KO 2021. 12. 4. 09:00
728x90
반응형

문제

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의 사이클의 길이를 구하는 프로그램을 작성하시오.


입력

첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.


출력

첫째 줄에 N의 사이클 길이를 출력한다.


 


문제 접근 방법

입력값과 그 합이 십의 자리 이상인 경우 문제가 없지만 사이클이 도는 중 혹은 입력이 일의 자리만 오는 경우 난감할 수 있다. 하지만 일의 자리만 오는 경우는 십의 자리를 0이라 생각해주면 쉽게 문제를 해결할 수 있게 된다. 예를 들어 1의 경우 0 + 1 = 1 이런 식으로 말이다. 그렇게 사이클을 돌려주고 몇 번의 반복이 한 사이클을 구성하는지 알게 해 줄 변수 cnt로 카운팅 해주면 이 문제도 쉽게 해결이 된다.


JAVA 코드 풀이

import java.util.*;

public class Main{
    public static void main(String args[]){
        Scanner input = new Scanner(System.in);
        int num = input.nextInt();
        // n1은 주어진수의 십의 자리수, n2는 일의 자리수, cnt는 카운팅해주는 변수
        int n1 = num / 10, n2 = num % 10, cnt=1;
        //temp는 각 자리수의 합, ans는 계산을 시행했을 때 나온 결과값
        int temp = n1 + n2, ans = n2*10 + temp;
        
        while(num != ans){ // 계산 후 결과값이 첫 입력값과 같을때까지 반복
            n1 = n2; // 결과값의 십의 자리가 계산 전 일의 자리수이므로 해당 줄이 나온다.
            n2 = ans % 10; // 결과값의 일의자리를 구하기 위해 10으로 나눈 나머지를 구해준다.
            temp = n1 + n2;
            ans = n2*10 + temp%10; // 각각 가장 오른쪽에 있는 수를 결합해 ans를 구한다.
            cnt++; //한 사이클동안 몇번의 반복이 이루어지는지 체크해준다.
        }
        System.out.println(cnt);
    }
}

코드 실행 결과


후기

나머지 연산을 이용하여 일의 자리를 구할 줄 알고, 반복해야 할 횟수를 시행 전에는 모르니까 for반복문보다는 while반복문을 이용하는 것이 적절하고, 총 몇 번 반복했는지 동시에 카운트해주면 이 문제는 쉽게 해결될 문제라 생각이 든다.


문제 원본

https://www.acmicpc.net/problem/1110

728x90
반응형