본문 바로가기

Programmers

[프로그래머스][JAVA]Lv. 2 - n진수 게임

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

사용할 진수 = n

구해야 하는 숫자의 개수 = t

참가하는 인원 = m

플레이어의 순서 = p

 

n진수를 이용하여 0부터 숫자를 말하기.

10 이상의 숫자는 1, 0 이렇게 나눠서 말하기.

10~15는 A~F로 출력하기.

 

0부터 전체 플레이어의 수(m)*미리 구해야 하는 수(t)를 for문을 이용하여 반복

10~15는 A~F로 출력해야하기 때문에 조건을 걸어두고 이렇게 나누면서 구하면 뒤집히기 때문에 마지막에 .reverse()를 이용하여 다시 뒤집어서 답을 구해갔다.

int value = i;
StringBuilder sb = new StringBuilder();

do {
    if (value % n > 9) {
        if (value % n == 10) sb.append("A");
        else if (value % n == 11) sb.append("B");
        else if (value % n == 12) sb.append("C");
        else if (value % n == 13) sb.append("D");
        else if (value % n == 14) sb.append("E");
        else if (value % n == 15) sb.append("F");
    } else {
        sb.append(value % n);
    }
    value /= n;
} while (value != 0);

return sb.reverse().toString();

이후 미리 구해야 하는 숫자의 갯수가 될 때까지 인덱스를 증가해 가며, 플레이어의 순서가 되었을 때 StringBuilder에 추가해 주었다.

while (ansSB.length() != t) {
    if (index % m + 1 == p) {
        ansSB.append(sb.charAt(index));
    }
    index++;
}

아래는 전체 코드이다.

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

        StringBuilder sb = new StringBuilder();
        StringBuilder ansSB = new StringBuilder();
        for (int i = 0; i < t*m; i++) {
            sb.append(diversion(i, n));
        }
        int index = 0;
        while (ansSB.length() != t) {
            if (index % m + 1 == p) {
                ansSB.append(sb.charAt(index));
            }
            index++;
        }

        answer = ansSB.toString();
        return answer;
    }
    public String diversion(int i, int n) {
        int value = i;
        StringBuilder sb = new StringBuilder();

        do {
            if (value % n > 9) {
                if (value % n == 10) sb.append("A");
                else if (value % n == 11) sb.append("B");
                else if (value % n == 12) sb.append("C");
                else if (value % n == 13) sb.append("D");
                else if (value % n == 14) sb.append("E");
                else if (value % n == 15) sb.append("F");
            } else {
                sb.append(value % n);
            }
            value /= n;
        } while (value != 0);

        return sb.reverse().toString();
    }
}

그런데 Integer.toString(숫자, 진수)를 쓰면 자동으로 해당 진수로된 값으로 바꾸어 준다.

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

        for (int i = 0; i < t * m; i++) {
            sb.append(Integer.toString(i, n));
        }
        int index = 0;
        while (ansSB.length() != t) {
            if (index % m + 1 == p) {
                ansSB.append(sb.charAt(index));
            }
            index++;
        }

        return ansSB.toString().toUpperCase();
    }
}

때문에 진수로 변환하는 부분을 이렇게 Integer.toString()을 써서 변환해 주고 정답을 return 할 때 toUpperCase()로 영문자들을 대문자로 바꾸어주면 정답이 나올 것이다.