Computer Science/자료구조와 알고리즘

[JAVA] 백준 1110번 : 더하기 사이클

BS Kwak 2020. 7. 18. 22:02

1. 문제

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 

N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.

 

2.

<코드 -1>

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n,num;
        int cnt=0;
        n=sc.nextInt();
        num=n;
        while(true){
            num=num%10*10+(num/10+num%10)%10;
            cnt++;
            if(n==num)    break;
        }
        System.out.println(cnt);
        sc.close();
    }
}

 

코드 1 풀이

문제에서처럼 n=26을 예로 들어 설명해 보자면

cnt=0 (cnt: 사이클의 길이)

n=26

num=26

<반복문>

2+6=8 ( 2는 num/10 , 6은 num%10 이고, 8은 둘의 합이므로 num/10+num%10)이다. 

num=68 (10의 자리수이므로 6에 10을 곱해준다. 따라서 num%10*10이고, 8의 경우는 위에서 구한 합의 일의자리이므로 (num/10+num%10)%10이다. )

cnt++ (cnt는 1)

num이 n과 같아질때까지 반복한다. 

 

 

<코드 -2>

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n,a,b,sum,num;
        int cnt=0;
        n=sc.nextInt();
        num=n;
        while(true){
            a=num/10; b=num%10;
            sum=a+b;
            cnt++;
            num=b*10+sum%10;
            if(n==num)    break;
        }
        System.out.println(cnt);
        sc.close();
    }
}

 

 

 

코드 2 풀이

코드 2는 코드1풀이에서 설명한 보라색 부분을 각각 변수에 넣었다. 즉, num의 십의 자리수를 a, num의 일의 자리수를 b, 그 둘의 합을 sum에 대입했다. 

 

3.

이 문제에 관해 표를 그리니 문제 이해도 빨라지고 코드를 어떻게 짜야하는 지 구성하기 편리했다. 

다음에도 숫자가 헷갈리거나 변수가 많아지는 문제가 나오면 표를 그려서 해결하도록 해야겠다. 

 

4. 링크

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

 

1110번: 더하기 사이클

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,

www.acmicpc.net