프로그래머스-2018 KAKAO BLIND RECRUITMENT ( N진수 게임 by Java )

Flash·2022년 2월 21일
0

Programmers-Algorithm

목록 보기
42/52
post-thumbnail

구현

프로그래머스 2018 KAKAO BLIND RECRUITMENET Level 2 문제 N진수 게임Java를 이용해 풀어보았다.
간단한 문제였는데 알고보니 더 간단한 문제였다. 시방!

문제 링크 첨부한다.
https://programmers.co.kr/learn/courses/30/lessons/17687


N진수 만들어주기

주어진 수를 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()만 사용해서 대문자로 바꿔주면 끝... 허무했다.


N진수를 언제까지 이어붙여야 할까

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배 넘게 걸리는 테스트 케이스도 있는 것 같다.

profile
개발 빼고 다 하는 개발자

0개의 댓글