[Programmers] n진수 게임 (Java)
by 뚜부니
이 문제는 n진법을 구하는 방법을 적용하면 쉽게 해결할 수 있는 문제입니다 😎😎
각 숫자의 범위도 크지 않아서 m명의 인원이 t번 동안 진행하면서 나올 수 있는 모든 숫자 리스트를 만들었습니다.
다시 말하자면, [0, 1, 2, 3] 에 대해 2진법으로 말하면
0 → 0
1 → 1
2 → 10
3 → 11
과 같은 방식으로 바꾼 [0, 1, 1, 0, 1, 1]을 저장해두는 방식으로 진행했습니다.
이 때, 리스트에 저장하는게 아닌 n진법 구하는 방식을 쉽게 적용하기 위해 StringBuffer를 이용했어요
현재 구할 숫자가 5이고, 2진법을 적용한다면
5 % 2 = 0, 5 / 2 = 2
2 % 2 = 0, 2 / 2 = 1
이므로 5는 2진법으로 100이잖아요
계산은 위의 순서대로 진행되기 때문에 각 나머지에 대해 저장해두고, 마지막에 몫을 추가하면 001이 되는데
이 001을 뒤집으면 100으로 원하는 값을 구할 수가 있습니다.
이렇게 뒤집는 방식은 StringBuffer에서 제공하는 reverse()로 쉽게 해결할 수 있어요!
그래서 String Buffer를 이용했습니다. 😁😁
코드는 다음과 같이 작성했습니다.
import java.util.*;
class Solution {
public String solution(int n, int t, int m, int p) {
String answer = "";
StringBuffer strBuff = new StringBuffer(); // 게임 진행 시 숫자에 대해 저장
String[] decimal = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"}; // 숫자 규칙 적용을 위해 만든 배열
int gameCnt = t * m; // t * m번 안에 튜브가 t개의 숫자를 말함
int num = 0; // 게임 숫자는 0부터 시작
while (strBuff.length() < gameCnt) {
if (num < n)
strBuff.append(decimal[num]);
else {
StringBuffer subStrBuff = new StringBuffer(); // 현재 숫자의 n진법에 대해 임시로 저장할 str
int temp = num;
while (temp >= n) {
int mod = temp%n;
subStrBuff.append(decimal[mod]);
temp /= n;
}
subStrBuff.append(decimal[temp]);
strBuff.append(subStrBuff.reverse());
}
num++;
}
p--; // 숫자가 0부터 시작이므로 순서는 -1 해줘야 함
for (int i = 0; i < t; i++) {
answer += strBuff.charAt(p);
p += m;
}
return answer;
}
}
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] 튜플 (Java) (0) | 2022.09.03 |
---|---|
[Programmers] 호텔 방 배정 (Java) (0) | 2022.04.22 |
[Programmers] 섬 연결하기 (Java) (0) | 2021.06.10 |
[Programmers] 파일명 정렬 (Java) (0) | 2021.05.05 |
[Programmers] 구명보트 (Java) (0) | 2021.05.01 |
블로그의 정보
개발하는 두부
뚜부니