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

2 분 소요

업데이트:

문제

프로그래머스-n진수 게임
0부터 차례대로 n진수의 숫자를 말하는 게임에서 자신의 차례에 말해야 할 숫자를 구하는 문제.

  • 제한 사항
    진법 n : 2 <= n <= 16
    미리 구할 숫자의 갯수 t : 0 < t <= 1000
    게임 참가인원 m : 2<= m <= 100
    튜브의 순서 p : 1 <= p <= m

  • 예시
    n : 2 / t : 4 / m : 2 / p : 1
    2진수를 0부터 나열하면 다음과 같다.
    [0, 1, 10, 11, 100, 101, 110, 111, …]

게임 규칙에서는 한자리씩 끊어서 말해야 하므로 순서는,
[0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, …]
이때 게임인원 m은 2명이고, p의 순서는 1번이므로
말해야할 숫자는 [0, 1, 1, 1, 0, 0, 1, 0, 1, …]이다
구해야 할 숫자의 수는 t:4개 이므로 [0111]이다

풀이

t개의 숫자를 구하기까지 n진법으로 변환하여 문자열에 추가하고,
추가된 문자열의 길이가 구해야하는 수를 넘어가면 종료한다.
while(sb.length() < (t * m) + p)

n진수로 계산할 때는 변환해야 할 숫자가 k라면
k가 n보다 작을때까지 n으로 나누고, 나머지를 문자열에 추가한다
그리고 나눈 몫을 k로 두고 반복한다
몫이 n보다 작아지면 몫을 문자열에 추가하고 문자열을 뒤집는다
(흔히 2진수 계산할 때 나눠가며 나머지를 계산하는 거처럼)

코드를 처음 제출했을 때 정확성이 57점정도 나왔는데,
10진법을 넘어가면 10-A, 11-B 이런식으로 알파벳으로 표기되는 것 때문이었다
나머지 계산할 때는 11진법 이상이고, 나머지가 10이상이면 알파벳으로 표기하게끔 했는데
몫이 n보다 작을 때 알파벳 표기 확인을 안했다.. (ㅠㅠ)

그 부분을 수정하니까 통과할 수 있었다

소스코드

import java.util.*;
class Solution {
   static Map<Integer, String> map;

	public String solution(int n, int t, int m, int p) {
		map = new HashMap<>();
		map.put(10, "A");
		map.put(11, "B");
		map.put(12, "C");
		map.put(13, "D");
		map.put(14, "E");
		map.put(15, "F");

		// n진법, 숫자 갯수 t
		// 참가인원 m, 튜브 순서 p

		StringBuilder sb = new StringBuilder();
		StringBuilder ans = new StringBuilder();
		sb.append("0");
		int num = 1;
		while (sb.length() < (t * m) + p) {
			sb.append(getNumber(num, n));
			num++;
		}
		char[] c = sb.toString().toCharArray();
//		System.out.println(Arrays.toString(c));
		for (int i = p - 1; i < (t * m) + p - 1; i += m) {
			ans.append(c[i]);
		}
		return ans.toString().toUpperCase();

	}

	private String getNumber(int num, int n) {
		// num을 n진수로 변환하는 함수
		if (num < n)
			if (n > 10 && num > 9)
				return map.get(num) + "";
			else
				return num + "";
		StringBuilder tmp = new StringBuilder();
		int m = num;
		int last = 0;
		while (m >= n) {
			last = m % n;
			m = m / n;
			if (n > 10 && last > 9)
				tmp.append(map.get(last));
			else
				tmp.append(last);
		}
		if (n > 10 && m > 9)
			tmp.append(map.get(m));
		else
			tmp.append(m);
		return tmp.reverse().toString();
	}
}

댓글남기기