본문 바로가기

프로그래머스(Java)/Level 2

[프로그래머스] [3차] n진수 게임

728x90

코드 힌트

  1. 10진수를 n진수로 변환하기
    • 주어진 숫자를 원하는 진수로 변환하려면, 나머지 연산을 반복하여 숫자를 변환해야 합니다.
    • 예를 들어, 16진수로 변환할 때 10 이상은 'A', 'B' 등으로 표시됩니다. 숫자를 변환한 후 결과는 역순으로 정리합니다.
    • 이 과정을 통해 0부터 순차적으로 모든 숫자를 n진수로 변환하게 됩니다.
  2. 순번에 맞는 숫자 선택하기
    • 각 숫자를 변환한 후, 변환된 진법 숫자를 순서대로 확인하면서 자기 차례에 해당하는 숫자만 선택합니다.
    • n진수로 변환된 숫자에서 각 자릿수는 차례대로 참가자에게 할당됩니다. 자신의 순번에 맞는 숫자를 찾아서 결과에 추가합니다.
  3. 순번 관리
    • 플레이어의 차례는 순환적으로 돌아가므로, 순번을 % 연산으로 관리합니다.
    • 예를 들어, 참가자가 4명이라면 0, 1, 2, 3으로 순서가 반복되며, 자신이 원하는 순번에 해당할 때만 숫자를 추가합니다.

 


정답은 더보기 클릭

더보기
class Solution {
    public String solution(int n, int t, int m, int p) {
        StringBuilder result = new StringBuilder(); // 결과를 저장할 StringBuilder
        
        int currentNumber = 0; // 변환할 숫자 초기값
        int currentTurn = 0; // 현재 순번을 추적하기 위한 변수
        
        while (result.length() < t) { // t개의 숫자를 얻을 때까지 반복
            String convertedNumber = convertedNumberToBase(currentNumber, n); // 숫자를 n진수로 변환
            for (char c : convertedNumber.toCharArray()) { // 변환된 숫자의 각 자리 확인
                if (currentTurn == p - 1) { // 현재 순번이 자신의 순번과 일치할 때
                    result.append(c); // 해당 숫자를 결과에 추가
                }
                
                if (result.length() == t) { // 필요한 숫자를 다 모으면 결과 반환
                    return result.toString();
                }
                currentTurn = (currentTurn + 1) % m; // 순번을 다음 참가자로 변경
            }
            currentNumber++; // 다음 숫자로 이동
        }
        
        return result.toString(); // 최종 결과 반환
    }
    
    
    static String convertedNumberToBase(int number, int base) {
        StringBuilder result = new StringBuilder(); // 변환 결과를 저장할 StringBuilder
        String[] alpha = {"A","B","C","D","E","F"}; // 10진수 이상의 숫자를 위한 배열
        if (number == 0) {
            return "0"; // 숫자가 0이면 "0" 반환
        }
        
        while (number > 0) { // 숫자를 n진수로 변환
            int remainder = number % base; // 현재 숫자의 나머지를 구함
            
            if (remainder >= 10) { // 나머지가 10 이상이면 알파벳으로 변환
                result.append(alpha[remainder - 10]);
            } else {
                result.append(remainder); // 그렇지 않으면 숫자를 추가
            }
            
            number = number / base; // 숫자를 base로 나누어 다음 자리로 이동
        }
        
        return result.reverse().toString(); // 결과를 역순으로 반환
    }
}
728x90