티스토리 뷰

 

코딩테스트 연습 - [3차] n진수 게임

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

programmers.co.kr

  • 프로그래머스 코딩테스트 연습 2018 KAKAO BLIND RECRUITMENT Level 2 문제입니다.

 

나의 풀이


function solution(n, t, m, p) {
    var answer = '';

    p = p == m ? 0 : p; // 아래 로직에서 나머지와 비교하기 때문에 P가 m과 같으면 나머지가 0인경우 이므로 바꿔줌.
    let cnt = 0; // 삽입된 문자열의 수 체크할 변수
    let total = ''; // 진수변환 문자열
    let num = 0; 

    while (total.length < m * t) {
        total += num.toString(n);
        num++;
    }

    for (let i = 0; i < total.length; i++) {

        if (cnt == t) break;

        if ((i + 1) % m == p) {
            answer += total[i].toUpperCase();
            cnt++;
        }

    }

    return answer;
}

 

풀이 순서


  1. 진수변환한 문자열 값을 합친 값(total)이 m * t 보다 작을 때까지 [ 0 ~ ?? ] 까지 순서대로 진수변환을 하며 total에 문자열을 합쳐줍니다. 

    1. m(게임에 참여한 인원 수) * t(미리 구할 숫자의 개수)
      => m명 중 p번째 순서로 숫자를 뽑을 때 t개를 뽑아 낼 수 있는 최소 범위의 길이
  2. 구한 total의 길이만큼 반복하며 (i+1) % m == p 인경우 answer에 추가해줍니다.

    1. i+1 을 하는 이유는 인덱스와 순서를 맞춰주기 위함입니다. ( 1 based 인덱스 )

    2. 순서p는 만일 p와 m(게임에 참여한 인원 수)가 같은 경우는 나머지가 0인 경우로 체크해줘야하기 때문에 맨 처음 p의 값을 체크하여 값을 재할당하는 로직을 추가했습니다.
  3. 구해야할 t와 현재 추가된 cnt 값이 있으면 반복문을 종료합니다.

 

다른 사람의 풀이


function solution(n, t, m, p) {
    var tubeT = Array.apply(null,Array(t)).map((a,i)=>i*m+p-1);
    var line = '';
    var max = m*t + p;
    for (var i =0;line.length <= max; i++) {
        line += i.toString(n);
    }
    return tubeT.map(a=>line[a]).join('').toUpperCase();
}
  • tubeT는 순서p에 따라 뽑아야할 idx를 순차적으로 넣어놓은 배열입니다.
  • line은 t개를 뽑아 낼 수 있는 최소 범위의 길이를 가진 진법변환 문자열입니다.
  • tubeT의 idx에 해당하는 값을 뽑아와 문자열로 변환합니다.
  • 차이점

    • 나의 풀이

      뽑아야할 idx를 배열로 구해놓지 않고 진법변환문자열의 인덱스를 조건검사하며 참인 경우 문자열을 뽑는 방법 

    • 다른 사람의 풀이

      먼저 뽑아야할 idx를 구해놓고 진법변환문자열에서 미리 구해놓은 idx의 위치의 값들을 뽑는 방법

 

 

나의 풀이와 다른 사람의 풀이와 비교해봤을 때 로직상 크게 다르지는 않지만 시간 복잡도와 쓸모없는 비교를 통한 메모리 낭비를 생각해보면 후자로 구현하는 것이 훨씬 효과적이다 ! 실제로 나의 풀이로는 9초에 통과한 케이스가 후자의 풀이로는 6초만에 통과했다. 아마 이 문제가 효율성 또한 체크하는 문제였으면 나는 통과하지 못했을 것 같다. 분발하자 ㅠㅠ 
댓글