본문 바로가기
프로그래머스

프로그래머스 lv2 - n진수 게임 (자바) [2018 KAKAO BLIND RECRUITMENT]

by dragonDeok 2024. 6. 9.
728x90

문제


n진수 게임

풀이


<내 풀이>

  • 진법 변환을 통해 변환된 숫자를 문자열로 바꾼다.
  • 바꾼 문자열 길이만큼 순서별로 호출하는 숫자를 체크한다.
    • 튜브 순서인 경우 t를 감소하고 답에 해당 숫자를 추가한다.
  • t가 0이 되면 종료한다.

<다른 풀이 ( 더 간결한 풀이 )>

  • 참가 인원이 모두 하나씩 숫자를 말해야 튜브의 순서가 한 번 지나가는 것이다.
    • t개의 숫자를 미리 구하기 위해 (참가 인원 * 미리 구할 숫자 개수) 만큼의 숫자 변환을 해놓는다.
  • 진법 변환은 Integer.toString(int i, int radix) 함수를 사용
    • 숫자 i를 radix에 해당하는 진법으로 변환하는 함수
    • 단, 16진수의 10 ~ 15인 A,B,C,D,E,F는 소문자로 변환해주기 때문에 toUpperCase()로 대문자로 바꿔줘야 함

어려웠던 점


  • 튜브의 순서를 체크하는 로직에서 살짝 로직 실수를 해서 시간이 좀 걸렸다.

코드


내 풀이 ( 통과 )

  class Solution {
    public String solution(int n, int t, int m, int p) {
        int num = 0, cnt = 0; // num : 숫자, cnt : 순서
        String answer = "";
        while(t > 0) {
            String cNum = change(n, num); // 진법 변환된 숫자를 문자열로 바꾼 상태 ( 범위를 넘어가는 긴 숫자가 나올 수 있기 때문)

            for (int i = 0; i < cNum.length(); i++) { // 문자열 길이만큼 순서를 돌림 -> 10이면 1, 0을 호출하는 걸 처리
                if (cnt % m == p - 1) { // 튜브 순서
                    answer += cNum.charAt(i);
                    t--;
                    if (t == 0) break;
                }
                cnt++;
            }
            num++;
        }

        return answer;
    }

    String change(int n, int num) {
        if (num == 0) return "0";
        String str = "";
        while(num > 0) {
            String s = "";
            int temp = num % n;
            switch(temp) {
                case 10: s = "A"; break;
                case 11: s = "B"; break;
                case 12: s = "C"; break;
                case 13: s = "D"; break;
                case 14: s = "E"; break;
                case 15: s = "F"; break;
                default: s = String.valueOf(num % n); break;
            }
            str = s + str;
            num /= n;
        }

        return str;
    }
  }

다른 풀이 ( Integer.toString() 활용 )

  import java.util.*;

  class Solution {
    public String solution(int n, int t, int m, int p) {
        StringBuilder convert = new StringBuilder();
        StringBuilder answer = new StringBuilder();

        // convert의 길이가 미리 구할 숫자 갯수 * 게임 참가 인원만큼 될 때 까지 n진수로 변환
        for(int i = 0; convert.length() <= t * m; i++){
            convert.append(Integer.toString(i, n));
        }

        // 튜브의 순서에 해당하는 글자들만 추출
        for(int i = p - 1;  answer.length() < t; i += m){
            answer.append(convert.charAt(i));
        }

        return answer.toString().toUpperCase();
    }
  }

참고


n진수 변환을 해주는 함수인 Integer.toString()을 구글링을 통해 새롭게 알게 됨