컴퓨터/프로그래머스

프로그래머스 - 17687번: [3차] n진수 게임 [Java]

이상한 나그네 2023. 10. 28. 00:18

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

 

프로그래머스

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

programmers.co.kr

1. 코드

import java.util.*;
class Solution {
    public String solution(int n, int t, int m, int p) {
        StringBuilder answer = new StringBuilder();
        int cnt = 0;
        for(int i = 0; answer.toString().length() < t; i++) {
            String s = convert(n, i);
            for(char c : s.toCharArray()) {
                if(cnt % m == p - 1)
                    answer.append(c);
                if(answer.toString().length() == t) break;
                cnt++;
            }
        }
        return answer.toString();
    }
    
    private String convert(int n, int num) {
        StringBuilder sb = new StringBuilder();
        if(num == 0) sb.append(0);
        while(num > 0) {
            if(num % n < 10)
                sb.append(num % n);
            else
                sb.append((char)(num % n - 10 + 'A'));
            num /= n;
        }
        return sb.reverse().toString();
    }
}

2. 설명

private String convert(int n, int num) {
    StringBuilder sb = new StringBuilder();
    if(num == 0) sb.append(0);
    while(num > 0) {
        if(num % n < 10)
            sb.append(num % n);
        else
            sb.append((char)(num % n - 10 + 'A'));
        num /= n;
    }
    return sb.reverse().toString();
}

StringBuilder를 사용하여 n은 진수를 나타내며 num은 10진수를 기준으로 저장된 수이며 convert 함수는 10진수인 num을 n진수로 변환시켜주는 함수입니다. 만약 num % n이 10 이상이라면 문자열 'A'부터 'F'로 이루어집니다.

public String solution(int n, int t, int m, int p) {
    StringBuilder answer = new StringBuilder();
    int cnt = 0;
    for(int i = 0; answer.toString().length() < t; i++) {
        String s = convert(n, i);
        for(char c : s.toCharArray()) {
            if(cnt % m == p - 1)
                answer.append(c);
            if(answer.toString().length() == t) break;
            cnt++;
        }
    }
    return answer.toString();
}

반복문은 answer의 길이가 t만큼될 때까지 반복합니다. convert 함수에서의 반환된 값을 문자열 s에 저장한 뒤 문자열의 요소를 문자로 분리하여 튜브의 순서인 p가 되면 answer에 추가하는데 문자열의 문자를 읽을 때마다 순서가 바뀐다.

1.숫자를 0부터 시작해서 차례대로 말한다. 첫 번째 사람은 0, 두 번째 사람은 1, … 열 번째 사람은 9를 말한다.
2. 10 이상의 숫자부터는 한 자리씩 끊어서 말한다. 즉 열한 번째 사람은 10의 첫 자리인 1, 열두 번째 사람은 둘째 자리인 0을 말한다.

위 조건 중 2번째 조건은 10진수로 10이상이 아닌 정확히는 n진수로 변환된 값이 2자리 이상인 경우를 의미하며 이 부분을 이해하면 10진수로는 2를 2진수로 변환하면 10이며 이때 1과 0을 따로 분리하며 한명의 차례로 인정합니다.

입출력 예제 첫 번째 케이스

위 그림은 입출력 예제의 첫번째 케이스입니다. 0부터 4까지의 과정이며 튜브가 말해야하는 숫자는 0111입니다.

3. 정리

  • 문제에서 요구하는 것을 다르게 이해해서 오래걸렸다.
  • 문제를 쉽게 이해한다면 빠르게 해결 가능하다.
출처: 프로그래머스 코딩 테스트 연습, 
https://school.programmers.co.kr/learn/challenges