프로그래머스 2018 KAKAO BLIND RECRUITMENET Level 2 문제 N진수 게임을 Java를 이용해 풀어보았다.
간단한 문제였는데 알고보니 더 간단한 문제였다. 시방!
문제 링크 첨부한다.
https://programmers.co.kr/learn/courses/30/lessons/17687
주어진 수를 N진수로 표현하면 어떻게 되는지 만들어줘야 한다.
가장 대표적인 로직을 이용했다.
static String createNDigit(int n, int num){
if(num==0) return "0";
String res = "";
while(num!=0){
int add = num % n;
if(add>=10){ // 10~16 은 A~F로 반환
res = (char)(add+55) + res;
}
else
res = add + res;
num /= n;
}
return res;
}
나는 여기서 10~16
에 대해서 직접 55를 더해서 아스키코드를 받아오는 방식으로 구현했다. 그런데 알고보니 Integer.toString(숫자, 진법)
을 이용하면 알아서 변환해주더라... 그냥 toUpperCase()
만 사용해서 대문자로 바꿔주면 끝... 허무했다.
t
개의 수를 m
명 가운데서 말하려면 m
명이 모두 t
개의 수를 말한다고 가정할 때 최소 m*t
만큼의 길이까지만 N진수를 이어 붙여주면 된다. 이렇게 완성한 전체 문자열에서 순번에 맞는 위치의 글자들만 이어붙여주면 된다.
이를 코드로 표현하면 다음과 같다.
String totalLine = createTotalLine(n,t,m);
for(int i=0; i<t; i++){
int idx = (p-1) + (m * i);
answer += totalLine.charAt(idx);
}
/** 전체 라인 만들어주는 메소드 정의하기 */
static String createTotalLine(int n, int t, int m){
String res = "";
int num = 0;
while(res.length()<=t*m){
String curNumStr = createNDigit(n, num);
res += curNumStr;
num++;
}
return res;
}
아래는 내가 제출한 전체 코드다.
public class NDigitGame {
static String solution(int n, int t, int m, int p) {
String answer = "";
String totalLine = createTotalLine(n,t,m);
for(int i=0; i<t; i++){
int idx = (p-1) + (m * i);
answer += totalLine.charAt(idx);
}
return answer;
}
static String createTotalLine(int n, int t, int m){
String res = "";
int num = 0;
while(res.length()<=t*m){
String curNumStr = createNDigit(n, num);
res += curNumStr;
num++;
}
return res;
}
static String createNDigit(int n, int num){
if(num==0) return "0";
String res = "";
while(num!=0){
int add = num % n;
if(add>=10){
res = (char)(add+55) + res;
}
else
res = add + res;
num /= n;
}
return res;
}
public static void main(String[] args) {
String answer = solution(16,16,2,1);
System.out.println(answer);
}
}
난 항상 solution
안에 다 때려박지 않고 분리해주려 노력하는데 이번 문제만큼은 그럴 필요도 없을 만큼 Integer.toString(int num, int radix)
를 이용하면 훨씬 간단했기에 다음과 같이 작성해도 될 것 같다.
아래는 프로그래머스의 다른 사람의 풀이를 참고한 코드다.
String solution(int n, int t, int m, int p) {
String answer = "";
String totalLine = "";
int num = 0;
while(totalLine.length()<=t*m){
totalLine += Integer.toString(num++, n);
}
for(int i=0; i<t; i++)
answer += totalLine.charAt(p-1+(m*i));
answer = answer.toUpperCase();
return answer;
}
다만 시간은 10배 넘게 걸리는 테스트 케이스도 있는 것 같다.