[java] 프로그래머스 - n진수 게임
업데이트:
문제
프로그래머스-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();
}
}
댓글남기기