KimMinJun
Coding Note
KimMinJun
전체 방문자
오늘
어제
  • 분류 전체보기 (487)
    • ALGORITHM (11)
      • 정렬 (6)
      • 최단경로 (1)
      • 자료구조 (1)
      • 슬라이딩 윈도우 (1)
      • etc (2)
    • Git (5)
    • Web (24)
      • Vanilla JS (13)
      • TS (2)
      • React (7)
      • ETC (1)
    • React 공식문서 (번역, 공부) (11)
      • Quick Start (2)
      • Installation (0)
      • Describing the UI (9)
      • Adding Interactivity (0)
      • Managing State (0)
      • Escape Hatches (0)
    • Next.js 공식문서 (번역, 공부) (3)
      • Getting Started (2)
      • Building Your Application (1)
    • PS (432)
      • 백준 (187)
      • Programmers (105)
      • CodeUp (21)
      • STL (3)
      • 제코베 JS 100제 (50)
      • SWEA (0)
      • LeetCode (65)
    • IT (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 관리

공지사항

인기 글

태그

  • Level 1
  • js
  • programmers
  • 그래프
  • tree
  • codeup
  • 수학
  • C
  • C++
  • LeetCode
  • string
  • 다이나믹 프로그래밍
  • 제코베 JS 100제
  • 정렬
  • 문자열
  • recursion
  • Level 0
  • 백준
  • Level 2
  • Level1

최근 댓글

최근 글

hELLO · Designed By 정상우.
KimMinJun

Coding Note

제코베 JS 100제 / 85 / 숫자놀이
PS/제코베 JS 100제

제코베 JS 100제 / 85 / 숫자놀이

2022. 9. 29. 19:18

일정한 규칙을 가지고 있는 숫자를 나열하는 놀이를 하는 중입니다.

이전 숫자에서 각 숫자의 개수를 나타내어 숫자로 만들고 다시 그 숫자를 같은 규칙으로 만들며 나열합니다.

이 놀이는 1부터 시작합니다.

다음 수는 1이 1개이기 때문에 '11'이 되고,

'11'에서 1이 2개이기 때문에 그다음은 '12'가 됩니다.

 

즉,

  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개)

위와 같이 진행되는 규칙을 통해 진행 횟수 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
    'PS/제코베 JS 100제' 카테고리의 다른 글
    • 제코베 JS 100제 / 87 / 천하제일 먹기 대회
    • 제코베 JS 100제 / 86 / 회전 초밥
    • 제코베 JS 100제 / 84 / 숫자뽑기
    • 제코베 JS 100제 / 83 / 수학 괄호 파싱 2
    KimMinJun
    KimMinJun

    티스토리툴바