[프로그래머스] n진수 게임 (JAVA/자바) - 2018 카카오 기출

·2021년 9월 8일
0

Algorithm

목록 보기
53/60

문제

프로그래머스>코딩테스트 연습>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번째 말할 숫자까지 구하고 리턴해주면 된다.


  1. 우선 숫자를 n진법으로 바꿔주는 함수를 만든다.
    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;
}
  1. num과 turn을 1씩 증가시키며 튜브의 turn에 말해야 하는 숫자를 하나씩 answer에 추가해준다. turn은 0부터 시작해서 0, 1, 2, ... 와 같이 증가한다.
    turn을 게임에 참가하는 인원m으로 모듈러 연산 후 +1을 더해주면 반복적인 순서가 나온다. 이 값이 p일 경우 (튜브의 순서일 경우) 튜브의 turn에 말해야 하는 숫자임을 알 수 있다. if (turn % m + 1 == p)

  2. 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

🤦‍♀️ 메모

  • n진법을 직접 코드로 구현하는 것이 새롭게 느껴졌다. 맨날 라이브러리 만들어진거 사용하다 보니 내부적으로 어떤 식으로 진행되는 건지 많이 잊어버린 것 같다.. 이번 기회에 잘 알아둘 것.

참고 사이트

딱히 없음

profile
당근먹고 자라나는 개발자

0개의 댓글