catsridingCATSRIDING|OCEANWAVES
Challenges

프로그래머스 | Level 2 | [3차] n진수 게임

jynn@catsriding.com
Jul 07, 2024
Published byJynn
999
프로그래머스 | Level 2 | [3차] n진수 게임

Programmers | Level 2 | [3차] n진수 게임

Problems

Description

튜브가 활동하는 코딩 동아리에서는 전통적으로 해오는 게임이 있다. 이 게임은 여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는 게임인데, 규칙은 다음과 같다.

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

이렇게 게임을 진행할 경우, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, … 순으로 숫자를 말하면 된다.

한편 코딩 동아리 일원들은 컴퓨터를 다루는 사람답게 이진수로 이 게임을 진행하기도 하는데, 이 경우에는 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, … 순으로 숫자를 말하면 된다.

이진수로 진행하는 게임에 익숙해져 질려가던 사람들은 좀 더 난이도를 높이기 위해 이진법에서 십육진법까지 모든 진법으로 게임을 진행해보기로 했다. 숫자 게임이 익숙하지 않은 튜브는 게임에 져서 벌칙을 받는 굴욕을 피하기 위해, 자신이 말해야 하는 숫자를 스마트폰에 미리 출력해주는 프로그램을 만들려고 한다. 튜브의 프로그램을 구현하라.

Constraints

  • 진법 n, 미리 구할 숫자의 갯수 t, 게임에 참가하는 인원 m, 튜브의 순서 p 가 주어진다.
  • 2 ≦ n ≦ 16
  • 0 < t ≦ 1000
  • 2 ≦ m ≦ 100
  • 1 ≦ pm

Examples

ntmpresult
2421"0111"
161621"02468ACE11111111"
161622"13579BDF01234567"

Solutions

  • TC: O(n)
  • 💾 SC: O(n)
Solution.java
import java.util.*;

class Solution {

    public String solution(int n, int t, int m, int p) {
        StringBuilder digits = new StringBuilder();
        int number = 0;
        while (digits.length() < t * m) {
            String digit = Integer.toString(number++, n).toUpperCase();
            digits.append(digit);
        }
        
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < t; i++) {
            char answer = digits.charAt(i * m + (p - 1));
            result.append(answer);
        }
        
        return result.toString();
    }
}

Approaches

이 문제는 각 숫자를 지정된 진법으로 변환하고, 각 참가자가 말해야 하는 숫자를 차례로 배열하여, 튜브가 말해야 하는 숫자를 추출하는 방식으로 해결할 수 있습니다. 이를 위해 다음과 같은 단계로 접근합니다:

  • 전체 게임 진행 순서 생성:

    • 0부터 시작하여 필요한 만큼의 숫자를 n진수로 변환하여 하나의 문자열로 이어붙여 게임에서 말할 모든 숫자를 준비합니다.
    • 숫자를 n진수로 변환하는 작업은, Integer.toString(int number, int radix) 함수를 사용합니다. 이 함수는 정수 number를 진법 radix로 변환한 문자열을 생성합니다. 예를 들어, number가 10이고 n이 16일 때, 이 함수는 "A"를 반환합니다.
    • 변환된 문자열을 StringBuilder 객체에 계속 이어붙여 최종 문자열을 만듭니다.
    • 이 과정을 StringBuilder의 길이가 t * m에 도달할 때까지 반복하여 필요한 모든 숫자를 포함하는 문자열을 생성합니다. 여기서 t * m은 튜브가 말해야 하는 숫자의 총 길이를 의미합니다. t는 튜브가 말해야 하는 숫자의 개수이고, m은 게임에 참가하는 인원의 수이므로, t * m은 게임이 진행되는 동안 생성되는 숫자의 총 길이를 나타냅니다.
  • 튜브가 말해야 하는 숫자 추출:

    • 게임에 참가하는 인원이 m명이고, 튜브의 순서가 p일 때, 튜브가 말해야 하는 숫자는 전체 게임 진행 순서에서 m의 배수로 반복되는 위치에 있습니다.
    • 예를 들어, 튜브가 첫 번째 순서이고 게임 참가자가 2명이라면, 튜브는 1, 3, 5, ... 번째 숫자를 말하게 됩니다.
    • 이 위치를 계산하기 위해 i * m + (p - 1) 공식을 사용합니다. 여기서 i는 0부터 t - 1까지 증가하며, 각 반복마다 튜브가 말해야 하는 숫자의 인덱스를 계산합니다. i * m은 각 회차를 의미하고, (p - 1)은 튜브의 순서에서 1을 뺀 값을 의미하여 튜브가 말해야 하는 정확한 위치를 계산할 수 있습니다.
    • 앞서 생성한 전체 게임 진행 순서에서 계산된 인덱스를 사용하여 해당 문자를 추출하고, 이를 결과 문자열에 추가합니다. 이 과정을 t번 반복하여 튜브가 말해야 하는 모든 숫자를 StringBuilder에 추가합니다.

이 알고리즘의 시간 복잡도는 O(n)이며, 공간 복잡도도 O(n)입니다. 이는 주어진 문제를 효율적으로 해결하는 데 충분합니다.

  • Algorithm
  • Simulation