티스토리 뷰

문제 - (programmers.co.kr/learn/courses/30/lessons/17687)

진수라는 개념을 알고 표현해낼 수 있다면 어렵지 않은 문제였다.

0부터 표현했을 때,

2진수는 0 1 01 10 11 100...

3진수는 0 1 2 10 11...

이런 식으로 표현되는데, 구하는 방법은 어렵지 않다

 

나는 재귀로 로직을 구현했다.

10진법 k를 n진수로 표현하고 싶다면,

  1. k를 n으로 계속해서 나누면서 그 나머지 값은 sb에 append 하고 몫을 다음 재귀에 넘긴다
  2. 계속 반복하다 보면 재귀로 넘겨받은 몫이 n보다 작아지는 시점이 온다.
  3. 그 시점이 오면 그때는 몫을 sb에 append 한다.

팁,

10부터 16까지는 A~F로 쓰라고 했으므로 배열로 대칭시켜서 저장해놓으면 편하다

numbers = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};


📌주의할 점

  • 재귀의 가장 깊은 지점이 먼저 등장해야 하므로 재귀를 호출한 다음에 sb.append를 사용한다.

 


코드

class Solution {
    StringBuilder sb;
    char[] numbers;

    public String solution(int n, int t, int m, int p) {
        String answer = "";
        numbers = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

        sb = new StringBuilder();
        // 구해야하는 자릿수는 m * t

        // 진법 확인해서 0~?? 까지 n진수 문자열 만들기
        int length = m * t;
        int i = 0;
        while (true) {
            if (makeStr(i++, n, length)) break;
        }

        // 튜브의 순서를 가지고 해당 자리 숫자만 뽑아오기
        int order = p - 1; // 0부터 시작이므로
        StringBuilder sb2 = new StringBuilder();
        for (int k = 0; k < length / m; k++) {
            sb2.append(sb.charAt(order));
            order += m;
        }

        return sb2.toString();
    }

    private boolean makeStr(int target, int n, int length) {
        if (sb.length() >= length) return true;
        if (target < n) {
            sb.append(numbers[target]);
            return false;
        }
        makeStr(target / n, n, length);
        sb.append(numbers[target % n]);
        return false;
    }
}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함