[프로그래머스] n진수 게임 문제풀이 (Java)

ajufresh·2020년 7월 28일
0

프로그래머스

목록 보기
13/14

🔗 링크

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


🎲 문제

0부터 1부터 증가하는 수를 n진수로 바꾸어서 순서대로 말하는 게임이 있다.

이 때 주인공 튜브의 답지를 만들어야한다.

미리 구할 숫자의 갯수 t와 게임에 참가하는 인원 m, 튜브의 순서 p가 주어질 때

튜브의 답을 구해야한다.

👀 예제로 문제 파악하기

입력 : n 2 / t 4 / m 2 / p 1

⇒ 2진법으로 순서대로 말하는 게임이며 미리 구할 숫자의 갯수는 4개이다.

여기에서 튜브는 2명 중 1번째이기 때문에

0111을 순서대로 말해야한다.

따라서 0111을 리턴한다.

😮 알고리즘 풀이 순서

  1. binaryStr을 초기화해준다. 이 문자열은 n진법으로 변환한 값을 넣을 문자열이다.
    • 0부터 시작하기 때문에 0을 미리 넣어준다.
  2. 16진법일 경우에는 10을 넘은 숫자는 알파벳으로 바꿔줘야하기 때문에 알파벳을 순서대로 담은 alpaForMoreThan10을 초기화해준다.
  3. 1, 2, 3, 4 ... 처럼 증가된 숫자를 넣어줄 num을 1로 초기화해준다.
  4. binaryStr의 길이보다 게임 참가인원 * 미리 구할 숫자의 갯수가 작아질때까지 while을 돌린다.
    1. 해당 num에서의 n진수로 변환된 값을 구할 subBinarys를 구한다.
    2. 몫을 넣을 quot, 나머지를 넣을 remain을 구한다.
    3. num의 진수를 구하기 위해 몫이 0보다 작아질 때 까지 while문을 돌린다.
      1. remain에는 나머지, quot에는 몫을 넣어준다.
      2. 나머지가 10보다 크면 알파벳으로 바꿔주고, 그렇지 않다면 그대로 subBinarys에 더해준다.
    4. subBinarys을 뒤집은 값을 binaryStr에 더해준다.
  5. 튜브의 순서에 해당하는 값을 뽑아내서 answer에 더해준다.

💻 코드

public class Solution {
  public String solution(int n, int t, int m, int p) { // n진법, 미리 구할 숫자의 갯수 t, 게임에 참가하는 인원 m, 튜브의 순서 p

    StringBuilder answer = new StringBuilder("");
    StringBuilder binaryStr = new StringBuilder("0"); // 0부터 시작하기 때문에 0을 미리 넣어놓는다.

    String[] alpaForMoreThan10 = {"A", "B", "C", "D", "E", "F"}; // 16진수일 경우에 바꿔줄 알파벳들

    int num = 1;

    while (binaryStr.length() - 1 < t * m) { // 미리 구할 숫자의 갯수 * 인원의 길이까지 답이 나올만큼 반복한다.

      StringBuilder subBinarys = new StringBuilder("");
      int quot = num; // 몫
      int remain; // 나머지

      while (quot > 0) {
        remain = quot % n;
        quot = quot / n;

        if (remain >= 10 && remain <= 15) { // 알파벳으로 바꿔야 하는 경우
          subBinarys.append(alpaForMoreThan10[remain-10]);
        } else {
          subBinarys.append(remain);
        }
      }
      binaryStr.append(subBinarys.reverse());
      num++;
    }

    int tubePlace = p;

    for (int i = 0; i < t; i++) {
      answer.append(binaryStr.charAt(tubePlace - 1));
      tubePlace += m; // 튜브 차례
    }

    return answer.toString();
  }

  @Test
  public void 정답() {
    Assert.assertEquals("0111", solution(2, 4, 2, 1));
    Assert.assertEquals("02468ACE11111111", solution(16, 16, 2, 1));

  }
}
profile
공블로그

0개의 댓글