본문 바로가기
일반 학습/코딩 테스트

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

by StelthPark 2022. 3. 11.

처리조건

풀이

입력값 : solution(16, 16, 2, 1);

 

우선 입력형식을 잘봐야했다. 진법n과 게임에 참가하는 인원m, 튜브순서p는 어떤 값인지 이해가 됐지만 미리구할 숫자갯수 t는 무슨뜻인지 몰랐고 처음 이해한 바로는 숫자t까지 구한다는 뜻인줄 알고 t까지의 n진법을 모두 표현해서 result에 담아보았다. 결과를 보면 아래처럼 18개의 요소가 들어간다.

그럼 여기서 상단 입력값중 튜브가 위치한 순서인 p는 1로써 맨처음이니 0,2,4,5,6,8,A,C,E,1이다. 문제 입출력예제이는 뒤에도 1이 몇개가 더붙여서 결과를 보여주는데 이는 내가 t의뜻을 잘못 이해한 것이다.

 

출력형식에 보면 튜브가 말해야하는 숫자t를 보면 이해하기가 쉽다. 튜브가 말해야하는 숫자t개라고 말하고 있으니 모든참가자가 각각 가지는 이런 말해야하는 숫자는 튜브가 가진 t의 갯수 곱하기 참가인원수가 될 것이므로 t*m이 된다.

그렇다면 while문을 돌려 0부터 N까지 n진수로 계산한 문자열을 계속 str에 담아주면 된다. 그러다가 이 str이 우리가 총 찾아야할 전체 참가자들이 각각 가지는 말해야하는 숫자 합보다 커진다면 while문을 종료해주면 될 것이다.

 

while문이 끝나면 아까랑은 위랑은 다른 문자열이 나온다.

 

여기서 이제 p의 순서에 있는 것을 찾기 위해 for문을 str 길이만큼 돌리게 answer에 쌓게 되는데 answer이 튜브가 말하는 숫자 갯수 t랑 같아진다면 종료해야할 것이다. (break) 이제 p의 순서에 누가 포함되는지 if문으로 걸러보자.

 

i는0부터 시작한다. 하지만 우리 참가인원은 1부터 시작한다 인원이0은 아니니까~ 그래서 i+1를 해주고 % m을 한 나머지가 p자신이 되면 된다. 또는 i+1를 % m한 나머지가 0이면 자기가 순서 중 맨 뒤에 있으므로 인원수랑 자신이랑 같아야한다. 이렇게 answer이 만들어지면 알파벳들은 대문자로 변경하여 리턴한다.

 

난이도2치고는 정말 쉬웠고 반복문이랑 진수변환만 할 줄 알면 풀 수 있었으나 처음에 t에 대해 잘못 생각하는바람에 문제에 대해 정확히 이해하지 못했고.. 여기서 삽질을 좀 많이 한 것 같다.

 

const solution = (n, t, m, p) => {
  let answer = "";
  let str = "";
  let i = 0;
  while (str.length <= t * m) {
    const baseStr = i.toString(n);
    str += baseStr;
    i++;
  }

  for (let i = 0; i < str.length; i++) {
    if (answer.length === t) break;
    if ((i + 1) % m === p || ((i + 1) % m === 0)) {
      answer += str[i];
    }
  }
 return answer.toUpperCase();
};

댓글