본문 바로가기

알고리즘/백준알고리즘

[백준알고리즘-JAVA]1110번 풀이(더하기사이클)

안녕하세요

인포돈 입니다.



백준 알고리즘 1110번 풀이입니다. 


* 참고사항
 - 개발환경은 eclipse을 기준으로 작성되었습니다.
 - java언어를 이용하여 문제를 풀이합니다.
 - 알고리즘 문제는 풀이를 보고 해답을 찾는 것도 중요하지만 무엇보다 스스로 풀이를 시도해봐야 합니다!!
(해당 풀이를 보기 전 충분히 문제에 대해 고민해봐야 합니다!)
 - 해당 풀이 말고도 수많은 풀이 방법이 존재합니다.


백준 1110 (더하기 사이클)

 

문제

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이 주어진다. N0보다 크거나 같고, 99보다 작거나 같은 정수이다.

 

 

출력

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

 

입력 예시

26

출력 예시

4

 

성공코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String[] args) {
	
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

			try {
				int count = 0;
				int num = Integer.parseInt(br.readLine());
				int equl = num;
				
				do {
					num = (num/10 + num%10)%10 + (num%10)*10;
					count++;
				}while(equl != num);
				
				System.out.println(count);
				
			} catch (Exception e) {
				e.printStackTrace();
			} 
			
			}//main
		}

 

해당 문제를 풀면서 많은 생각을 하게 되었어요 ㅜㅜ 정답을 알고 보니 정말 간단한 문제였는데, 너무 꼬아서 생각했었던 거 같네요.

 

이전에는 Bufferedreader를 통해 받음 입력을 배열, StringTokenizer 등을 통해 분리해서 비교하여 더하는 코드를 작성했었습니다.... 오래 걸렸습니다. 결국 제 한 시간 안에 풀지 못하여, 다른 해답을 찾아보았습니다. 비교적으로 정말 간단하게 풀이해두신 분이 많았더라고요.

 

다시 한번 감탄했었죠. 해당 성공코드를 분석해보도록 합시다.

 

해당 코드에서 가장 중요한 코드는 바로 아래 코드라고 볼 수 있습니다.

num = (num/10 + num%10)%10 + (num%10)*10;

 

사용자의 입력을 Bufferedreader로 받아 int형으로 바꿔준 값이 num에 들어가게 됩니다. 그렇다면 그 num을 어떻게 지지고 볶아야 더하기 사이클이 나오게 될까요?

 

입력 예시처럼 26을 넣으면 4라는 값이 나와야 되죠. 저희가 구해야 되는 값들은 바로 2+6=8이라는 값과 그 뒤에 있는 6이라는 값이 다음 값에 들어가게 되죠. 그림으로 쉽게 표현하면 다음과 같습니다. 

 

 

이 흐름도를 기억하시면서 아래 코드를 따라오시면 됩니다.

(num/10 + num%10)%10

 

해당 코드는 무엇을 의미할까요? (여기서 num은 예시입력으로 주어진 26이라고 가정합니다.)

 

26/10 = 2

26%10 = 6

 

이게 무엇을 의미할 까요? 네 바로 다음 상태의 1의 자리를 결정하기 위해서 입력의 1의 자릿수와 10의 자릿수를 더하는 작업을 진행하게 되죠. 

 

좀 더 쉽게 생각하기 위해서 1 ~ 99의 숫자에서 /10 10으로 나누면 10의 자리를 의미하게 됩니다.

반면에 %10으로 나머지를 구하게 되면 바로 1의 자리를 의미하게 됩니다.

 

그렇다면 이제 주어진 코드 맨뒤에 %10는 더 해서 나온 수의 일의 자리를 뜻하게 되는 거죠.

 

(num%10)*10

그럼 이 코드는 이제 해석하기가 쉬워지죠. num의 1의 자리 숫자를 가져와 *10을 해주어 다음 숫자의 10의 자리에 들어갈 수 있게 되죠.

 

간단히 num을 26으로 가정하면, 다음수는 68이 나오게 되죠. 이런 식으로 총 4번을 반복하면 26이 나오게 됩니다.

 

이런식으로 수학적으로 접근하여 문제를 풀이하면, 코드가 간결해지게 됨을 알 수 있었습니다.

num = (num/10 + num%10)%10 + (num%10)*10;

 


가장 중요한 코드 외에 필요한 다른 코드들을 간략히 살펴보겠습니다.

 

 - int count = 0;  // 결과 화면에 출력되는 변수로 더하기 사이클이 몇 번 이루어졌는지 알 수 있는 변수 역할

 - int num  //사용자의 입력을 int형으로 받는 변수 역할

 - int equl  //처음 입력된 값을 저장하여, 사이클이 언제 끝날지 알려주는 변수 역할

 

해당 변수들을 통해 간단히 해당 문제를 풀 수 있습니다.