[프로그래머스]n진수 게임 with Java

hyeok ryu·2023년 11월 25일
1

문제풀이

목록 보기
40/154

문제

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


입력

진법 n, 미리 구할 숫자의 갯수 t, 게임에 참가하는 인원 m, 튜브의 순서 p 가 주어진다.


출력

튜브가 말해야 하는 숫자 t개를 공백 없이 차례대로 나타낸 문자열. 단, 10~15는 각각 대문자 A~F로 출력한다.


풀이

제한조건

2 ≦ n ≦ 16
0 < t ≦ 1000
2 ≦ m ≦ 100
1 ≦ p ≦ m

접근방법

문제를 이해하는 과정이 제법 어려웠다.

아래와 같은 예제로 이해해보자.

ntmpresult
2421"0111"

우선 진법이 2이다.

0, 1, 10, 11, 100, 101, 110, 111, ...
-> 011011100101110111...

그리고 튜브가 미리 알고 있어야 할 숫자가 t개 필요하다.
참가하는 인원이 m이므로, 이진수를 이어붙인 길이가 m x t 만큼 필요하다.

튜브의 순서가 p라고 주어지므로
튜브는 p번째, p+m번째, p+2m번째.. 의 숫자가 필요하다.

타 언어는 우선 진법 변환 작업이 먼저 필요하다.
하지만 JAVA언어는 아래와 같이 Integer Class에 구현되어 있다..

https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html

따라서 로직만 정리하자면 다음과 같다.

1. 구해야할 전체 길이를 구한다.
2. 0부터 n진수로 변환해서 계속 이어붙인다.
3. 튜브의 순서를 고려하여, 숫자를 계속 이어붙인다.

코드

class Solution {
    public String solution(int n, int t, int m, int p) {
        
        StringBuilder sb = new StringBuilder();
        int max = t * m; // 구해야할 길이
        for(int i = 0; sb.length() <= max; ++i){
            sb.append(Integer.toString(i, n).toUpperCase()); // n진수로 바꾸고, 문제 조건에 따라 A-F는 대문자로 표현
        }
        
        String prepared = sb.toString();
        StringBuilder result = new StringBuilder();
        // 튜브의 순서에 말할 문자만 더한다.
        for(int i = p - 1 ; i < max; i += m)
            result.append(prepared.charAt(i));
        return result.toString();
    }
}

0개의 댓글