본문 바로가기

알고리즘/백준

[1110]더하기 사이클

수행일자 : 2021.07.17


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

 

1110번: 더하기 사이클

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

www.acmicpc.net


문제

  • 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의 사이클 길이를 출력한다.

입출력 예제


패턴식을 파악하면 되는 문제이다.

 

Scanner와 BufferedReader/StringBuilder 를 사용하여 총 2가지의 방식으로 풀어볼 수 있다.

단, 알고리즘의 패턴만 파악하면 동일한 문제이기 때문에 패턴을 파악하는 과정을 먼저 설명하려고 한다.

 

N 이라는 정수와 T라는 새로운 정수를 가정해보자.

N의 1의 자리수는 새로운 정수인 T의 10의 자리수이고 N의 1자리수와 10자리수를 더한 값이 새로운 수 T의 1의 자리이다.

이제 차례대로 식을 만들어보자.

  • 첫번째로는 N의 1의 자리수가 T의 10의 자리수가 되는 것이다. 이는 N을 10으로 나눈 나머지 값에 10을 곱하여 만들 수 있다. 즉, T의 10의 자리수는 아래와 같다.
    • T = (N%10) * 10
  • 두번째로는 각 자리의 합을 구하기 위해 T의 1의 자리수를 만드는 것이다. N을 10으로 나눈 몫을 구하고 이 값을 N을  10으로 나눈 나머지와 더해서 1의 자리수를 만든다. 즉, T는 아래와 같다. 여기에서 주의할 점은 N의 몫과 나머지를 더한 값이 두자리일 경우이다. 이럴 떄에는 두 자리 중 일의 자리 수를 더해야 하므로 더한 값을 한번 더 계산해서 나머지를 구해준다.
    • T = ( N/10 + N%10 ) % 10
  • 결과적으로 T 라는 값은 아래와 같은 식으로 이루어지게 된다.
    • T = ((N%10) * 10) + (( N/10 + N%10 ) % 10)

패턴을 파악했으면 이제 문제를 풀어보자.


1. Scanner

먼저, 입력받을 정수 N을 선언한다. 그리고 N의 값을 받을 변수인 result를 선언한다.

  • result를 선언하는 이유는, N과 동일한 값인지 아닌지를 확인하기 위해서이다.

그리고 사이클의 길이를 넣어줄 변수 count를 선언한다.

그러면 이제 while문을 선언하여 패턴식을 넣어 출력해보자.

먼저 count를 하나 추가해주고 패턴식을 사용하여 N의 값을 변경해준다.

처음에 입력받은 N이라는 수를 저장한 result라는 변수와 비교하여 동일한 값이 나오게 되면 while을 멈추고 count를 출력한다.

while문에 조건을 N과 result가 동일한게 아니고 true로 넣는 이유는 맨 처음에는 두 값이 동일하기 때문에 해당 조건으로 설정하면 while문이 원하는대로 돌지 않기 때문이다. 그래서 true를 넣어 무조건 실행을 시키고 if문으로 break를 걸어 조건이 달성되면 빠져나오게 한 것이다.

답안 소스 - Scanner

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int N = sc.nextInt();
		int result = N;
		int count = 0;
		
		while(true) {
			count++;
            
			N = ((N%10) * 10 + (((N/10) + (N%10))%10)); 
            
			if(N == result) {
				break;
			}
		}
		System.out.println(count);
	}
}

2. BufferedReader

Scanner 와 마찬가지로 변수 N, result, count를 선언하여 while문을 작성한다.

한 줄에 여러 숫자를 입력하거나 값을 모아놓았다가 전부 출력해줄 팔요가 없으므로 출력을 위한 추가 클래스는 사용하지 않았다.

답안 소스 - BufferedReader

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

public class Main {

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		int result = N;
		int count = 0;
		
		while(true) {
			count++;
			
			N = ((N%10) * 10 + (((N/10) + (N%10))%10)); 
			
			if(N == result) {
				break;
			}
		}
		System.out.println(count);
	}
}

'알고리즘 > 백준' 카테고리의 다른 글

[2562]최댓값  (0) 2021.07.22
[10818]최소, 최대  (0) 2021.07.21
[10951]A+B - 4  (0) 2021.07.11
[10952]A + B -5  (0) 2021.07.11
[10871]X 보다 작은 수  (0) 2021.07.10