프로그래머스>코딩테스트 연습>2018 KAKAO BLIND RECRUITMENT>[3차] n진수 게임 - https://programmers.co.kr/learn/courses/30/lessons/17687
문제 자체는 간단하다. 0, 1, 2, ... 과 같이 수를 하나씩 늘려가며 n진법으로 바꾼 수를 한명씩 말하면 된다.
예를 들어 2진법이라면, 0 -> 0
1 -> 1
2 -> 10
3 -> 11
... 와 같이 변경 되고 한자리 씩 (0, 1, 1, 0, 1, 1, ...) 돌아가면서 말하는 방식이다.
튜브의 순서 p
가 주어지면, 튜브의 순서에 말해야하는 숫자를 출력한다. 튜브의 t
번째 말할 숫자까지 구하고 리턴해주면 된다.
2진법
, 3진법
, 4진법
, ... 16진법
까지 모두 구할 수 있어야 하므로 이미 만들어져있는 내장 함수를 사용하기에는 무리가 있다. 아래와 같은 코드를 사용하면 n에 맞게 변환할 수 있다.10~15는 각각 대문자 A~F로 출력한다
는 조건이 있으므로 조건에 맞게 알파벳으로 변환해 주어야 한다.StringBuilder builder = new StringBuilder();
while (num >= 1) {
int tmp = num % n;
builder.insert(0, tmp);
num /= n;
}
num과 turn을 1씩 증가시키며 튜브의 turn에 말해야 하는 숫자를 하나씩 answer에 추가해준다. turn은 0부터 시작해서 0, 1, 2, ... 와 같이 증가한다.
turn을 게임에 참가하는 인원m
으로 모듈러 연산 후 +1을 더해주면 반복적인 순서가 나온다. 이 값이 p일 경우 (튜브의 순서일 경우) 튜브의 turn에 말해야 하는 숫자임을 알 수 있다. if (turn % m + 1 == p)
answer의 길이가 t
가 되었다면 완료 된 것이므로 종료한다!
import java.util.HashMap;
public class Solution {
// 진법 n, 미리 구할 숫자의 갯수 t, 게임에 참가하는 인원 m, 튜브의 순서 p
public static String solution(int n, int t, int m, int p) {
String answer = "";
int num = 0;
int turn = 0;
OuterLoop:
while(true){
String converted = getConvertStr(num, n); // num을 n진수로 변경
if(converted.length()==0){ // num이 0일 경우 ""이 리턴되기 때문에 예외처리
converted = "0";
}
for (int i = 0; i < converted.length(); i++) {
if (turn % m + 1 == p) { // 튜브의 순서라면
answer += converted.charAt(i);
if(answer.length()>=t){ // 미리 구할 갯수만큼 구했다면 종료
break OuterLoop;
}
}
turn ++;
}
num ++;
}
return answer;
}
public static String getConvertStr(int num, int n){ // n : 진법
StringBuilder builder = new StringBuilder();
HashMap<Integer, String> 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");
while (num >= 1) {
int tmp = num % n;
builder.insert(0, tmp < 10 ? tmp : map.get(tmp)); // 10이상이면 알파벳으로 변경
num /= n;
}
return builder.toString();
}
}
난이도 : LEVEL 2
딱히 없음