<문제 설명>
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에는 과정의 반복된 횟수를 반환한다.
<코멘트>
쉬운 문제로 보였고, 실제로 과정 자체는 금방 생각해냈다.
이런 부분은 성장했다는 긍정적인 부분인 것 같다.
하지만 그것과는 별개로 반례를 찾는데 오래 걸렸다.
이 부분은 문제를 더 많이 풀어보면 그만큼 사고가 늘지 않을까 싶은 생각도 있지만,
속이 탄다....ㅎㅎ;;^^
'개발 > 코딩테스트' 카테고리의 다른 글
[프로그래머스 | JavaScript] 크기가 작은 부분 문자열 (0) | 2023.05.18 |
---|---|
[백준 | JavaScript] 10810 공 넣기 (0) | 2023.05.15 |
[프로그래머스 | JavaScript] 꼬리 문자열 (0) | 2023.05.13 |
[백준 | JavaScript] 9095 1,2,3더하기 (0) | 2023.05.10 |
[프로그래머스 | JavaScript] 조건에 맞게 수열 변환하기 1 (삼항연산자 간단 예제) (0) | 2023.05.09 |