Java - 알고리즘

백준 - 1110 더하기 사이클

TerianP 2022. 9. 14.
728x90

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

 

1110번: 더하기 사이클

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

www.acmicpc.net

 


풀이 방법

분명히 백준 쉬운 문제 라고 검색해서 찾아서 풀었는데...생각보다 오래걸렸던 문제였다.

그렇다고 어려운 문제는 아니고 다소 생각을 해야했던 문제

 

이 문제의 핵심 포인트는 아래와 같다.

1. 입력받는 n 이 10 보다 작다면 '뒤' 가 아닌 '앞' 에 0 을 붙여서 2자리로 만드는 것!! => 이 조건 때문에 크기가 2인 배열을 만들어서 문제를 풀었다.

2. 계산해서 만들어진 새로운 수의 각 자리수를 합했을 때 다시 10 보다 작다면 해당 숫자가 바로 새로운 수의 일의 자리가 된다. 만약 새로운 수의 각 자리수를 합했을 때 10보다 크다면 새로운 수의 일의 자리가 새로 만들어지는 수의 일의 자리가 된다.
=> 즉 각 자리수의 합 c 가 있다면 c 가 10보다 작다면 c 는 이후 새로 만들어지는 수 m 의 일의 자리가 된다. 이때 c 가 10 보다 크다면 c 의 일의 자리를 계산한 후 이 숫자를 다시 m 의 일의 자리에 넣어야 한다. 나는 이때 중간에 일의 자리에 대한 변수를 r 로 설정해두었다.

 

사실 말이 복잡하지 실제로 코드를 보고 코드 주석을 보면 오히려 이해가 쉬울 것이라고 생각된다.

package baekJoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// https://www.acmicpc.net/problem/1110
public class Quiz_1110 {
    static int n, k;
    static int m = 987654321;
    // 배열을 활용해서 풀이 => 십의자리 index = 0, 일의 자리 index=1
    static int[] num = new int[2];

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        k = n;

        int cnt = 0;

        // m 이 n 과 일치하면 while 문 종료
        // 일치하지 않으면 계속 반복
        while (m != n) {

            // 10보다 작은 경우 앞에 0 을 붙여서 2자리 숫자로 만든다
            if (k < 10) {
                num[0] = 0;
                num[1] = k;
            }else{
                // String.valueOf(k).charAt(0) 를 사용하면 반환되는 값은 char 를 int 로 바꾼 아스키 코드 값이
                // 나오기 때문에 이를 다시 숫자로 고치기 위해 -48 을 계산한다.
                num[0] = String.valueOf(k).charAt(0)-48;
                num[1] = String.valueOf(k).charAt(1)-48;
            }

            // 일의자리와 십의 자리를 더해서 만들어진 수 c
            int c = num[0]+num[1];

            int r; // 덧셈해서 만들어진 수의 일의 자리
            if (c < 10) { // c가 10보다 작으면 r 에는 c 를 그대로 대입
                r = c;
            }else{ // 아니면 1의 자리 숫자르 가져옴
                r = String.valueOf(c).charAt(1)-48;
            }

            // 만들어진 새로운 수 m
            m = num[1]*10+r;
            k = m;

//            System.out.println("a : " + a);
//            System.out.println("b : " + b);
//            System.out.println("c : " + c);
//            System.out.println("m : " + m);

            // 몇번째 사이클인지 cnt
            cnt++;
        }
        System.out.println(cnt);
    }
}

 

댓글