일정한 규칙을 가지고 있는 숫자를 나열하는 놀이를 하는 중입니다.
이전 숫자에서 각 숫자의 개수를 나타내어 숫자로 만들고 다시 그 숫자를 같은 규칙으로 만들며 나열합니다.
이 놀이는 1부터 시작합니다.
다음 수는 1이 1개이기 때문에 '11'이 되고,
'11'에서 1이 2개이기 때문에 그다음은 '12'가 됩니다.
즉,
- 1 -> (1)
- 11 -> (1이 1개)
- 12 -> (1이 2개)
- 1121 -> (1이 1개 2가 1개)
- 1321 -> (1이 3개 2가 1개)
- 122131 -> (1이 2개 2가 1개 3이 1개)
- 132231 -> (1이 3개 2가 2개 3이 1개)
위와 같이 진행되는 규칙을 통해 진행 횟수 N을 입력받으면 해당되는 수를 출력하세요.
/**
* 이전 숫자에서 각 숫자의 개수를 나타내어 숫자로 만들고
* 다시 그 숫자를 같은 규칙으로 만들어 나열했을때,
* N번째에 오는 수
*
* @description
* 1. 1 -> (1)
* 2. 11 -> (1이 1개)
* 3. 12 -> (1이 2개)
* 4. 1121 -> (1이 1개 2가 1개)
* 5. 1321 -> (1이 3개 2가 1개)
* 6. 122131 -> (1이 2개 2가 1개 3이 1개)
* 7. 132231 -> (1이 3개 2가 2개 3이 1개)
*
* @param {Number} N 진행 횟수
* @returns {Number} 진행 횟수에 해당되는 수
*/
function numberGame(N) {
let cur = '1';
N -= 1;
while (N--) {
let numberCnt = {};
for (el of cur) {
numberCnt[el] = numberCnt[el] + 1 || 1;
}
cur = Object.entries(numberCnt).flat().join('');
}
return cur;
}
const N = 6;
const result = numberGame(N);
console.log(result);
N을 함수시작에서 -1을 해준이유는 이미 첫번째 단계인 1을 cur이라는 변수에 초기화 해놓고 시작했기 때문이다.
numberCnt 라는 Object는 각 숫자가 몇번나왔는지 저장해주는 Object이다.
Object.entries는 각 [key, value]를 배열로 만들어서 return 해주는 함수인데, flat을 이용해서 1차원 배열로 만들어준다.
예를 들어 1이 3번 나왔고, 2가 1번 나왔다면 numberCnt에는 아래와 같이 저장되어 있을 것이다.
{
'1': 3,
'2': 1,
}
그러면 위를 Object.entries로 배열로 받았을 때는 아래와 같이 된다.
[['1',3], ['2',1]]
하지만 위를 그대로 join 하게 되면 1차원 배열 여러개를 붙인것과 같이 된다.
우리가 얻고자 하는 값은 위에 있는 각각의 원소인 1차원 배열들의 안에 있는 원소들을 이어붙인것이다.
따라서 flat()을 이용해서 차원수를 하나 줄여준다.
그러면 아래와 같이 된다.
['1',3,'2',1]
우리가 얻고자 하는 값은 1321이므로 이제 위의 원소값들을 join()을 이용해 모두 붙여주면 된다.
'PS > 제코베 JS 100제' 카테고리의 다른 글
제코베 JS 100제 / 87 / 천하제일 먹기 대회 (1) | 2022.09.30 |
---|---|
제코베 JS 100제 / 86 / 회전 초밥 (0) | 2022.09.29 |
제코베 JS 100제 / 84 / 숫자뽑기 (0) | 2022.09.29 |
제코베 JS 100제 / 83 / 수학 괄호 파싱 2 (0) | 2022.09.29 |