알고리즘

백준 JS | 1110번 더하기 사이클

3jun 2022. 4. 26. 23:06
출처 : 백준 온라인 저지 

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

 

1110번: 더하기 사이클

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

www.acmicpc.net

 

문제 요약

주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.

26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.

위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.

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

 

나의 접근방

단순하게 예제를 손으로 옮겨적고 경우의 수를 늘여뜨려 수식으로 구현하려고 했다. 

하지만 계속 변수를 업데이트 하고 그 변수를 가지고 비교하고 업데이트 하고 하나의 변수로 계속 수식을 구현하다보니 헷갈렸다.

또한 입력이 한자리 수 일 때, 두자리 수 일 때, 결과값이 한 자리 수 일때, 두 자리 수 일 때 4자기 예외케이스에 대해서도 코드를 작성해야 할뿐더러 매번 타입 변환도 해줘야하는 번거로움이 있었다.

단계가 복잡한만큼 실수할 여지도 많았고, 결과를 도출해내도 썩 좋지 않은 로직일 것이라는 생각이 들었다.

아직 3단계 문제 일 뿐인데.. 결국 문제를 스스로 풀지는 못했다.  

다른 사람의 풀이

const readline = require('readline');
const rl = readline.createInterface({
	input: process.stdin,
    output: process.stdout,
});

rl.on('line', function(line) {
    const input = +line;
    let num = +line;
    let sum;
    let count = 0;
    
    while (true) {
    	count++;
        
        sum = Math.floor(num/10) + num % 10;
        num = (num % 10) * 10 + sum%10;
        
        if(input === num){
        	break;
        }
    }
	console.log(count);

}).on('close', function() {
	process.exit();
});

수식이 이루어지는 자리값을 계산하는 수식을 알면 쉽게 해결할 수 있는 문제였다.

1의 자리의 수 : 주어진 값 % 10    즉, num % 10

10의 자리의 수 : Math.floor(num / 10)

1의 자리의 수 10의 자리의 수로 만들기 : (num%10) * 10