algorithm/프로그래머스

[프로그래머스] n 진수 게임 (09.02)

자바왕세자 2020. 9. 2. 23:06

문제

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

 

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

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

programmers.co.kr

 

접근법

알고리즘 요즘 너무 어렵다..

콘이 t번 외치려면 적어도 t*m(콘이 외칠 횟수 x 참가인원 수) 만큼은 모두 알아야 한다.

0부터 시작해서 계속 n진수로 변환을 하면서 길이를 계산하여 충분한 길이가 되었을 때 멈춘다.

n진수로 변환된 문자열에서 콘이 외쳐야할 순서의 문자들을 결과 StringBuiler에 append 해준다.

변환하는 로직은 메서드로 따로 빼서 구현했다.

처음에 0은 그냥 0이 되므로 res에 0을 append해준다.

그 후 1부터 n진수를 계산해 올라가면서 res에 append해준다.

n진수로 변환하는 로직에 대한 설명은 주석에 포함했다.

 

코드

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

        String convertedStr = convert(n, t, m);

        for(int i=p-1;i<convertedStr.length();i +=m){
            if(answer.length() == t)
                break;
            answer.append(convertedStr.charAt(i));
        }
        return answer.toString();
    }

    public String convert(int n, int t, int m){
        StringBuilder res = new StringBuilder();
        res.append(0);
        
        int i=1;
        
        while(true){
            int num = i;
            StringBuilder sb = new StringBuilder();
            
            while(num > 0){
                //tmp에 나머지 값을 저장한 후
                int tmp = num%n;
                //tmp 값이 10이상이면 알파벳 출력하고
                //tmp 값이 10이 안되면 순서대로 sb에 append
                sb.append(tmp >= 10 ? String.valueOf((char)('A' + (tmp-10))) : tmp);
                num/=n;
            }
            
            i++;
            //n진수를 계산하고 나서 그 결과의 역순을 res에 append
            res.append(sb.reverse());
            
            if(res.length() > t*m)
                break;
        }
        return res.toString();
    }
}