프로그래머스 n진수 게임 JavaScript
2023년 1월 5일
문제 풀이
입력 값으로 진법 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;
}