JAVA/JAVA Algorithm

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

오늘의 진 2022. 8. 29. 22:11

문제

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보다 작거나 같은 정수이다.

 

 

(구상)

입력은 버퍼를 통해 받는다. 

 

1. 사이클을 돌리는 방법 

: 2자리수인경우 : 10으로나눈 몫 과 10으로 나눈 나머지를 더한다. 

(10으로나눈나머지)*10 + (10으로나눈 몫 + 10으로 나눈 나머지 )%10

 

그리고 10의로 나눈 나머지 *10 + (10의로 나눈 몫 + 10으로 나눈 나머지 ) 를 연산하여 새로운 수를 만들어 준다.

조건으로 원래수와 같다면 카운트를 멈추고 브레이크를 걸어준다. 

: 만약 한자리 수라면 

원래수*10 +원래수 를 연산하여 새로운 수를 만들어준다. 

 

이때 연산한 수를 num에 계속 담아주는 방식으로 연산을 진행시켰다. 

근데 첫번째 연산은 n에 대해서 진행해 주어야 함으로 while문 밖에서 진행해 주었다. 그리고 

플러그를 하나 만들어주었다. 

만약 한번의 연산으로 순환이 끝난다면?? 그렇다면 while문은 필요가 없어진다. 그러므로 플러그를 달아서 

한번 연산을 했을때 num ==n 이된다면  flg를 false로 만들어서 while문이 돌지 않도록 구현하여 주었다. 

 

package codingTest;

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

public class Algorithm17 {

	public static int cycle(int n) {

		int num = -1;
		int cnt = 1;
		boolean flg = true;

		num = (n % 10) * 10 + (n / 10 + n % 10) % 10;
		if (num == n) {
			flg = !flg;

		}

		while (flg) {

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

			if (num == n)
				break;

		}
		return cnt;

	}

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

		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

		int n = Integer.parseInt(bf.readLine());

		System.out.println(cycle(n));

	}

}

'JAVA > JAVA Algorithm' 카테고리의 다른 글

[백준] 11720번 숫자의 합  (0) 2022.08.31
[백준] 2292번 벌집  (0) 2022.08.30
[백준] 2884번 알람시계  (0) 2022.08.28
[백준] 18258번 큐2  (0) 2022.08.28
[백준] 10828번 스택  (0) 2022.08.26