Bin's Blog

[프로그래머스] Level2 - n진수 게임(Javascript) 본문

Algorithm

[프로그래머스] Level2 - n진수 게임(Javascript)

hotIce 2023. 4. 23. 16:18
728x90
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

▶ 문제 요약

1. 게임의 규칙은 숫자 0부터 시작해 차례대로 말하되, 10 이상의 숫자부터는 한 자리씩 끊어서 말한다.

2. 이진법에서부터 십육진법까지 모든 진법으로 게임을 진행할 수 있습니다.

3. 출력할 숫자의 개수는 t이며, 게임에 참가하는 인원은 m명입니다. 튜브는 p번째로 말해야 합니다.

 

▶ 코드

function solution(n, t, m, p) {
    let answer = "";
    const array = [];
    // 전체 길이는 구해야할 숫자 개수 * 참가 인원
    let totalLength = m * t;
    
    for (let i = 0; i < totalLength; i++) {
        // 0부터 시작하는 숫자를 n진법으로 변환
        let number = i.toString(n).toUpperCase();
        // 문자를 분할      
        let numberSplit = number.split("");
        // 분할된 문자를 배열에 넣기      
        for (let j = 0; j < numberSplit.length; j++) {
            array.push(numberSplit[j]);
        }
    }
    // 튜브 순서에만 해당하는 값을 넣기
    for (let k = p-1; k < array.length; k+=m) {
        answer += array[k];
    }
    // 미리 구할 숫자의 개수를 구한다.
    return answer.slice(0, t);
}

▶ 풀이 과정

1. 미리 구할 숫자의 개수를 찾으려면 전체 길이는 =  (구해야 하는 숫자 개수 * 참가 인원)을 해야 내 차례에 해당하는 값을 찾을 수 있다.

 

예시를 들면

ex) 만약 구해야 할 개수가 4개이며, 참가 인원이 2명이고, 튜브의 순서가 1이라면,  우리는 (1, 3, 5, 7)이라는 값을 구해야한다. 그렇게 하려면 4 * 2 = 8개의 즉 범위를 확보해야 우리가 원하는 값을 구할 수 있다. 

 

2. 전체 길이만큼 범위를 돌면서 toString()는 문자열로 변하게 하는 메서드이지만 괄호 안에 (몇 진수로 바꾸고 싶니?) 바꾸고 싶은 진수를 넣으면 값을 변환해준다. 뒤에 toUpperCase() 문제 출력을 보면 소문자 알파벳이 아닌 대문자 알파벳이기 때문에 진수 변환할 때 대문자로 변환해준다. 

 

3. 위의 과정을 거치면 10이후의 숫자는 "10", "11"이 되는데 우리가 구하고 싶은 것은 10 이후 숫자를 분할해서 [1, 0], [1, 1] 와 같이 숫자를 하나씩 분할시켜야 한다. 그리고 나서 분할된 숫자를 배열에 담아준다.

 

4. 이제 배열을 돌면서 시작 지점은 p-1를 했는데 이유는 p는 순서를 의미하는데 예제 입력을 보면 1이나 2로 시작한다. 하지만 배열의 인덱스 특성상 0부터 시작하니 p-1를 해야 우리가 원하는 순서의 값을 올바르게 구할 수 있다. 문제의 핵심적인 부분은 for문의 3번째 인자이다.

for문의 3번째 인자는 "다음에 어떤 값을 받을 것인가?"에 대한 설정을 하는 부분이다. 위에 k += m 다음 값을 현재 게임의 참가 인원만큼 더해주게 되면 자기 순서에 해당하는 값만 찾을 수 있고 그 값을 배열에 더해준다. 

 

ex) 위에 예시를 가져오면 튜브의 순서는 (1, 3, 5, 7)이다 즉 다른 참가자의 순서가 지나야 다시 자기 차례로 돌아오게 된다. 

 

5. 튜브 순서에 해당하는 모든 값을 찾았으면 그 중에서 미리 구할 숫자의 개수(t)를 구한다. 여기서 slice()메서드를 사용하게 되면 우리가 원하는 만큼 문자열이나 배열을 자를 수 있다. 

 

 ex) slice(첫 번째 인자:시작값, 두 번째 인자: 끝값) 여기서 만약에 (0, 4)라면 (0, 3)까지의 값만 슬라이스 된다.         

728x90