[프로그래머스] [3차] n진수 게임 JavaScript

·2024년 5월 30일

문제

튜브가 활동하는 코딩 동아리에서는 전통적으로 해오는 게임이 있다. 이 게임은 여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는 게임인데, 규칙은 다음과 같다.

숫자를 0부터 시작해서 차례대로 말한다. 첫 번째 사람은 0, 두 번째 사람은 1, … 열 번째 사람은 9를 말한다.
10 이상의 숫자부터는 한 자리씩 끊어서 말한다. 즉 열한 번째 사람은 10의 첫 자리인 1, 열두 번째 사람은 둘째 자리인 0을 말한다.
이렇게 게임을 진행할 경우,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, …
순으로 숫자를 말하면 된다.

한편 코딩 동아리 일원들은 컴퓨터를 다루는 사람답게 이진수로 이 게임을 진행하기도 하는데, 이 경우에는
0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, …
순으로 숫자를 말하면 된다.

이진수로 진행하는 게임에 익숙해져 질려가던 사람들은 좀 더 난이도를 높이기 위해 이진법에서 십육진법까지 모든 진법으로 게임을 진행해보기로 했다. 숫자 게임이 익숙하지 않은 튜브는 게임에 져서 벌칙을 받는 굴욕을 피하기 위해, 자신이 말해야 하는 숫자를 스마트폰에 미리 출력해주는 프로그램을 만들려고 한다. 튜브의 프로그램을 구현하라.

입력

진법 n, 미리 구할 숫자의 갯수 t, 게임에 참가하는 인원 m, 튜브의 순서 p 가 주어진다.

2 ≦ n ≦ 16
0 < t ≦ 1000
2 ≦ m ≦ 100
1 ≦ p ≦ m

출력

튜브가 말해야 하는 숫자 t개를 공백 없이 차례대로 나타낸 문자열. 단, 10~15는 각각 대문자 A~F로 출력한다.

예제 입력

n : 2
t : 4
m : 2
p : 1

예제 출력

"0111"

내가 했던 풀이 방법

  1. notation 함수를 만든다. notation은 n진법과 n진법으로 표현할 수를 변환해주는 함수이다. 빈 문자열 앞에 n으로 나눈 나머지를 계속 더해주는 방식으로 진행되며, 만약 나머지가 10 이상일 경우에는 A~E로 변환해서 더해준다. 한 번 더해줄 때마다 num을 n으로 나눈 값으로 바꿔주며, 이때 소수점은 버린다. 처음 num값이 1이었을 때는 1을 반환하지 않고, 01을 반환하도록 해준다. (숫자를 1부터 진행하여 01을 반환하게 해주었다. 문제대로 구현하기 위해서는 반환부분을 제거하고 2번에서 num을 1이 아닌 0으로 해주면 된다.)
  2. game을 빈 문자열로 초기화해주고, 해당 문자의 길이가 m×t를 한 값보다 작을 때까지 game에 notation의 결과를 더해준다. 이때 수는 1부터 1씩 증가시켜준다. (m×t인 이유는 m명이 돌아가면서 말하기 때문에 한 라운드마다 m개의 단어를 사용한다. 튜브가 t개를 말해야하므로, t라운드까지는 진행될 수 있도록 해야한다.)
  3. answer에 game의 (i×m×(p-1))번째 단어들을 t번 더해준 뒤, answer를 return한다. (i는 for문을 돌면서 증가되는 변수이다. 즉 i×m은 i+1번째 라운드를 의미한다. 해당 라운드에 p번째에 말해야하고, index는 0부터 시작하므로 p-1번째 index에 있는 수를 말해야한다.)

코드

function solution(n, t, m, p) {
    var answer = '';
    
    let game = "";
    function notation(n, num) {
        let result = "";
        if(num===1) return "01";
        while(true) {
            if(num===0) break;
            let rest = num%n;
            if(rest>=10) {
                if(rest===10) rest="A";
                else if(rest===11) rest="B";
                else if(rest===12) rest="C";
                else if(rest===13) rest="D";
                else if(rest===14) rest="E";
                else rest="F";
            }
            result = rest + result;
            num = Math.floor(num/n);
        }
        return result;
    }
    
    let num = 1;
    while(game.length<m*t) {
        game += notation(n, num++);
    }
    for(let i=0; i<t; i++) {
        answer += game.charAt(i*m+(p-1));
    }
    return answer;
}

회고

진법 변환만 잘 해주면 되기 때문에 어려울 건 크게 없던 문제, 튜브가 말해야하는 수를 찾기 위한 index를 구하는 것만 잘해주면 금방 풀 수 있었다.

profile
Frontend🍓

0개의 댓글