본문 바로가기
Problem Solving/카카오 블라인드 기출

2018 - [3차] n진수 게임

by Libi 2021. 8. 7.
반응형

https://programmers.co.kr/learn/courses/30/lessons/17687

 

코딩테스트 연습 - [3차] n진수 게임

N진수 게임 튜브가 활동하는 코딩 동아리에서는 전통적으로 해오는 게임이 있다. 이 게임은 여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는 게임인데, 규칙은 다음과 같다. 숫자를 0

programmers.co.kr

[ 문제풀이 ]

이전에 풀었던 비밀지도 문제처럼 10진수를 n진수로 변환하는 방법을 알고 있다면 쉽게 해결할 수 있는 문제이다.

주어진 10진수의 수가 0보다 클 때까지 n으로 계속해서 나눠주면 된다. 출력할 때는 역순으로 출력해준다.

문자열의 길이가 내가 미리 구해야 할 숫자가 나오는 길이보다 클 때까지 모든 정수를 변환해서 문자열에 붙여준 후 내 턴에 맞는 문자를 출력해주면 된다.

mport java.util.*;

class Solution {
    //10보다 큰 수는 영어로 변환해야하기 때문에
    char[] ch = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
    
    public String solution(int n, int t, int m, int p) {
        //0은 나누기가 안되기 때문에 예외처리하고 1부터 시작
        StringBuilder sb = new StringBuilder("0");
        int num = 1;
        while (true) {
            int now = num;
            StringBuilder temp = new StringBuilder();
            
            //10진수 now를 n진수로 변환
            while (now > 0) {
                int mod = now % n;
                now /= n;
                //제일 앞에 삽입해줘야함
                temp.insert(0, Character.toString(ch[mod]));
            }
            sb.append(temp);
            
            //문자열의 길이가 미리 구해야할 숫자가 나오는 길이보다 크면 종료
            if (sb.length() >= t * m) break;
            
            num++;
        }
        
        StringBuilder answer = new StringBuilder();
        //나의 턴인 문자를 정답에 삽입
        for (int i = p, j = 0; j < t; i += m, ++j) {
            answer.append(sb.charAt(i - 1));
        }
        return answer.toString();
    }
}

이후에 찾아보니 10진수를 n진수로 변환할 수 있는 간단한 라이브러리가 존재하였다.

Integer.toString(i, n) //10진수 i를 n진수로 변환 (문자열)

이를 활용하면 굉장히 쉽게 해결할 수 있다. 다만, Integer.toString() 메서드는 'A'~'Z'를 'a'~'z'로 변환해주기 때문에 원하는 출력을 위해서 대문자로 변환해줘야 한다.

import java.util.*;

class Solution {
    public String solution(int n, int t, int m, int p) {
        StringBuilder answer = new StringBuilder();
        StringBuilder sb = new StringBuilder();
        
        for (int i = 0; sb.length() < t * m; ++i) {
        	//10진수 i를 n진수로 변환
        	//단, 'A'~'F'가 'a'~'z' 소문자로 변환되기 때문에 
        	//이후에 대문자로 변환해줘야함
        	sb.append(Integer.toString(i, n));
        }
        
        for (int i = p, j = 0; j < t; i += m, ++j) {
            answer.append(sb.charAt(i - 1));
        }
        
        //대문자로 변환
        return answer.toString().toUpperCase();
    }
}

 

 

반응형

'Problem Solving > 카카오 블라인드 기출' 카테고리의 다른 글

2019 - 실패율  (0) 2021.08.08
2019 - 오픈채팅방  (0) 2021.08.08
2018 - [3차] 파일명 정렬  (0) 2021.08.07
2018 - [3차] 자동완성  (0) 2021.08.07
2018 - [3차] 압축  (0) 2021.08.07

댓글