개발/코딩테스트

[백준 | JavaScript] 1110 더하기 사이클

prpn97 2023. 5. 14. 16:29

<문제 설명>

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의 사이클의 길이를 구하는 프로그램을 작성하시오.

 

<입출력>

input answer
26 4
55 3
1 60
0 1
71 12

<문제 풀이>

const fs = require("fs");
let input = fs.readFileSync("./input.txt").toString()
let num = Number(input)
let temp = num
let answer = 0
let firstNum = 0

    while(true){
        let splitTemp = temp.toString().split('').map(Number) 
        if(splitTemp.length<2){
            splitTemp.unshift(0)
        }
        firstNum = (splitTemp[0]+splitTemp[1])%10
        temp = splitTemp[1]*10+firstNum
        answer++
            if(temp===num)
                break
    }

console.log(answer)

**중간에 console.log(temp)를 입력하면 과정에 대해 살펴볼 수 있다. 

 

이 문제는 두자리 숫자를 자릿수별로 각각 나눈다.

나누기 전 1의 자리 숫자를 10의 자리에, 각 숫자의 합의 1의 자리 숫자를 1의 자리에 둔다.

 

테스트케이스를 대입해보자. 

26의 1의 자리인 6을 10의 자리에, 2+6인 8을 1의 자리에 두어 68이라는 숫자가 나온다.

동일하게 8이 10의 자리, 6+8의 1의 자리인 4를 1의 자리에 두어 84라는 숫자가 나온다.

4를 10의 자리, 8+4의 1의 자리인 2를 1의 자리에 두어 42가 나온다.

2를 10의 자리, 4+2의 1의 자리인 6을 1의 자리에 두어 26이 나온다.

 

총 4번의 과정을 거치게 된다. 

 

먼저 처음 temp는 처음 입력값이다. 

얼마나 과정을 거치게 될지 모르기 때문에 while로 반복했고,

temp의 각 숫자를 배열에 담아 반복문 안에 splitTemp라는 변수에 넣었다. 

 

splitTemp의 길이가 2보다 작을 때 배열의 첫번째 요소에 0을 넣는 이유는,

이후에 설명하겠다. 

 

만약 50을 넣어서 [5,0]이 되었을 때, firstNum은 5+0인 5의 나머지값인 5가 된다.

그리고 temp는 5,0에 있는 0*10과 5를 더한 5가 된다. 

반복문이 break되기 전까지 answer에 각 횟수를 하나씩 누적한다.

 

이제 temp가 5인 상태에서 splitTemp는 [5]가 된다.

unshift하는 조건문을 설명할텐데, 이 부분을 생략하고 진행해보자.

firstNum에는 temp의 10의자리, 1의자리 각각을 더한 값의 나머지를 구해야 하는데,

아까는 50에서 5+0을 했지만, 이번엔 temp의 5라는 요소는 한 개이기 때문에 

splitTemp[1]의 값이 없어서 정상적인 출력이 불가해진다. 

 

그래서 splitTemp의 길이가 2보다 작은 경우 즉, 이번 경우처럼 5가 되면

splitTemp를 [0,5]가 되도록 해주어 다음 진행을 이어갈 수 있게 해준다. 

반복문을 돌면서 answer에 값이 누적되고, temp값이 맨 처음 num값과 같아지게 되면

answer에는 과정의 반복된 횟수를 반환한다. 

 

<코멘트>

쉬운 문제로 보였고, 실제로 과정 자체는 금방 생각해냈다.

이런 부분은 성장했다는 긍정적인 부분인 것 같다.

하지만 그것과는 별개로 반례를 찾는데 오래 걸렸다. 

이 부분은 문제를 더 많이 풀어보면 그만큼 사고가 늘지 않을까 싶은 생각도 있지만,

속이 탄다....ㅎㅎ;;^^

728x90