프로그래머스 n진수 게임 JavaScript

2023년 1월 5일

프로그래머스 n진수 게임

문제 풀이

입력 값으로 진법 n, result의 길이 t, 게임 참가 인원 m, 튜브의 순서 p가 주어진다. 이 게임은 간단하게 말해 n진법 수를 차례대로 하나씩 말하는 게임이다.
예를 들어 입력 값이 n = 3, t = 4, m = 2, p = 1 이 주어지면
10진법: 0 1 2 3 4 5 6 ... 을 3진수로 변환해
3진법: 0 1 2 10 11 12 20 ... 이 되어 튜브의 순서 p = 1 일 때 말하여 0, 2, 0, 1 => 0201이 된다.
n진법 수들의 총 길이는 m명만큼 t번 말 해야 하기에 t*m 이 된다.

  • toString() 없이 푼 코드
    • function baseNumsCreate(n, maxLength): n진법의 수를 maxLength 만큼 구해 리턴
    • function nBaseConversion(n, num): 상숫값 num을 n진법의 수로 변환해 리턴
    • function numberOver10Conversion(num): 10 이상의 숫자 num을 A~F로 변환해 리턴
solution.js
function solution(n, t, m, p) {
    let answer = '';
    const baseNums = baseNumsCreate(n, t*m);
    let order = 0;
    for(let i = 0; i < baseNums.length; i++) {
        order++;
        if (answer.length === t) break;

        if (order === p) {
            answer+=baseNums[i];
        }
        if (order === m) {
            order = 0;
        }
    }
    return answer;
}

function baseNumsCreate(n, maxLength) {
    let baseNums = '';
    let currentNum = 0;
    while (baseNums.length <= maxLength) {
        const baseStr = nBaseConversion(n, currentNum);
        baseNums += baseStr;
        currentNum++;
    }
    return baseNums;
}


function nBaseConversion(n, num) {
    let temp = '';
    let remain = 0;
    while (num >= n) {
        remain = num % n;
        num = Math.floor(num / n);
        if (remain>=10)
            remain = numberOver10Conversion(remain);
        temp += String(remain);
    }
    if(num >=10) {
        num = numberOver10Conversion(num);
    }
    temp += String(num);
    return temp.split("").reverse().join("");
}

function numberOver10Conversion(num) {
    const numberOver10 = ['A', 'B', 'C', 'D', 'E', 'F'];
    if(num === 10) return numberOver10[0];
    if(num === 11) return numberOver10[1];
    if(num === 12) return numberOver10[2];
    if(num === 13) return numberOver10[3];
    if(num === 14) return numberOver10[4];
    if(num === 15) return numberOver10[5];
}
  • toString() 을 이용한 코드
    • function nBaseConversion(n, num), function numberOver10Conversion(num) 대신 toString(n)을 이용해 n진법 수를 얻어 간단하게 풀었다.
solution.js
function solution(n, t, m, p) {
    let answer = '';
    let order = 0;
    const baseNums = baseNumsCreate(n, t*m);
    for(let i = 0; i < baseNums.length; i++) {
        order++;
        if (answer.length === t) break;

        if (order === p) {
            answer+=baseNums[i];
        }
        if (order === m) {
            order = 0;
        }
    }
    return answer;
}

function baseNumsCreate(n, maxLength) {
    let baseNums = '';
    let currentNum = 0;
    while (baseNums.length <= maxLength) {
        const baseStr = currentNum.toString(n).toUpperCase();
        baseNums += baseStr;
        currentNum++;
    }
    return baseNums;
}

댓글