[프로그래머스] 17687. n진수 게임

3 분 소요

문제 링크

[프로그래머스] 17687. n진수 게임


풀이 과정

맨 먼저 숫자( num )를 하나씩 증가시키며 n 진법으로 변환하여 표기합니다.

String converted = convert(num++, n);


10진수 num 을 n 진법으로 표기한 문자열로 변환하는 convert() 메소드는 아래와 같습니다. 해당 진수로 계속 나누고, 그 나머지를 붙여가는 방식으로 진수 변환을 진행했습니다.

public static String convert(int num, int radix) {
    if (num == 0) return "0";

    String converted = "";

    while (num > 0) {
        int quotient = num / radix;
        int remainder = num % radix;

        switch (remainder) {
            case 10:
                converted = 'A' + converted; break;
            case 11:
                converted = 'B' + converted; break;
            case 12:
                converted = 'C' + converted; break;
            case 13:
                converted = 'D' + converted; break;
            case 14:
                converted = 'E' + converted; break;
            case 15:
                converted = 'F' + converted; break;
            default:
                converted = remainder + converted;
        }

        num = quotient;
    }

    return converted;
}


위 함수에서 파라미터 radix 는 변환되는 진법을 의미하며, 이 값이 11 이상인 경우 나머지는 10 이상의 수가 나올 수 있습니다. 예를 들어, 아래와 같이 10진수 10 을 11진법으로 변환하면, 문자열 10 이 아닌 A 로 표현되야 합니다.

http://dl.dropbox.com/s/0a0idx6cdzf3667/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-17687_n%EC%A7%84%EC%88%98%20%EA%B2%8C%EC%9E%84-1.png


위와 같이 10 진법을 넘어가는 순간, 나머지가 10 이상이 되어, 나머지를 그대로 붙이게 되면 진법 변환은 잘못 이루어집니다. 문제에서는 16진법까지 표현이 가능하다고 하므로, 나머지 값 10 부터 15까지를 각각 A부터 F까지로 치환해 문자열에 이어 붙여 줬습니다.

위 함수로 변환된 문자열을 순회하며 튜브를 포함해 게임에 참가한 나머지 인원들이 순서대로 하나씩을 말하게 됩니다.


진법( n ) : 2
미리 구할 숫자의 개수( t ) : 4
게임에 참가하는 인원( m ) : 2
튜브의 순서( p ) : 1

예를 들어, 위 문제에서 주어진 입력 예시에 따르면 아래와 같이 튜브가 숫자를 취할 수 있게 됩니다.

http://dl.dropbox.com/s/qj4kglu020b8z5u/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-17687_n%EC%A7%84%EC%88%98%20%EA%B2%8C%EC%9E%84-2.png

count 변수를 하나씩 증가시킬 때, 튜브는 count % m == p 인 순간 해당 단어를 말해야 합니다. 위 예시의 경우, 1, 3, 5, 7 모두 m 값 2 로 나눈 나머지는 1 이 됩니다.

하지만, 만약 위 예시에서 그룹내 튜브의 순서가 제일 마지막이라면, 위 수식 count % m 결과 값은 0이 됩니다. 따라서, 튜브가 그룹의 가장 맨 뒤에 위치할 때에는 다른 조건을 줄 필요가 있었습니다. 튜브가 그룹 내 맨 뒤에 위치함은 수식 count % m == 0 && m == p 으로 표현할 수 있습니다.


코드

Java

public class Main {
    public static String solution(int n, int t, int m, int p) {
        String answer = "";
        int num = 0;
        int count = 1;
        boolean exit = false;

        while (!exit) {
            String converted = convert(num++, n);

            for (char c : converted.toCharArray()) {
                if (t == 0) {
                    exit = true;
                    break;
                }

                if (count % m == p || (count % m == 0 && m == p)) {
                    answer += c;
                    t--;
                }

                count++;
            }
        }

        return answer;
    }

    public static String convert(int num, int radix) {
        if (num == 0) return "0";

        String converted = "";

        while (num > 0) {
            int quotient = num / radix;
            int remainder = num % radix;

            switch (remainder) {
                case 10:
                    converted = 'A' + converted; break;
                case 11:
                    converted = 'B' + converted; break;
                case 12:
                    converted = 'C' + converted; break;
                case 13:
                    converted = 'D' + converted; break;
                case 14:
                    converted = 'E' + converted; break;
                case 15:
                    converted = 'F' + converted; break;
                default:
                    converted = remainder + converted;
            }

            num = quotient;
        }

        return converted;
    }

    public static void main(String[] args) {
        solution(2, 4, 2, 1);
//        solution(16, 16, 2, 1);
//        solution(16, 16, 2, 2);
    }
}

Javascript

const solution = (n, t, m, p) => {
    let answer = "";
    let num = 0;
    let count = 1;
    let exit = false;

    while (!exit) {
        let converted = convert(num++, n);

        for (c of converted) {
            if (t == 0) {
                exit = true;
                break;
            }

            if (count % m == p || (count % m == 0 && m == p)) {
                answer += c;
                t--;
            }

            count++;
        }
    }

    return answer;
};

const convert = (num, radix) => {
    if (num == 0) return "0";

    let converted = "";

    while (num > 0) {
        let quotient = num / radix;
        let remainder = num % radix;

        switch (remainder) {
            case 10:
                converted = "A" + converted;
                break;
            case 11:
                converted = "B" + converted;
                break;
            case 12:
                converted = "C" + converted;
                break;
            case 13:
                converted = "D" + converted;
                break;
            case 14:
                converted = "E" + converted;
                break;
            case 15:
                converted = "F" + converted;
                break;
            default:
                converted = remainder + converted;
        }

        num = parseInt(quotient);
    }

    return converted;
};

solution(2, 4, 2, 1);
// solution(16, 16, 2, 1);
// solution(16, 16, 2, 2);

카테고리:

업데이트:

댓글남기기