csmoon1010의 SW 블로그

[210125] n진수 게임 - 2018 KAKAO BLIND RECRUITMENT 본문

Coding Test/프로그래머스

[210125] n진수 게임 - 2018 KAKAO BLIND RECRUITMENT

csmoon1010 2021. 1. 25. 12:04

0. 문제유형 : 반복문 활용

1. 문제이해

programmers.co.kr/learn/courses/30/lessons/17687

 

코딩테스트 연습 - [3차] n진수 게임

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

programmers.co.kr

(1) 주요 요구사항

 

① 게임 규칙

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

→ 이 중 튜브가 말해야 하는 숫자를 스마트폰에 미리 출력해주는 시스템

 

② 입력, 출력 형식

  • 입력 - 진법 n : 2 <= n <= 16- 미리 구할 숫자의 갯수 t : 0 < t <= 1000- 게임에 참가하는 인원 m : 2 <= m <= 100- 튜브의 순서 p :
  • 출력- 튜브가 말해야하는 숫자 t개를 공백 없이 차례대로 나타낸 문자열- 10~15는 대문자 A~F로 출력

 

 

 

 

 

 

2. 전략

(1) n진법 변환

: 기존의 n진법 구하는 원리를 활용 (Stack 자료구조 함께 활용)

number : 바꾸고자 하는 수
n : 진법
temp가 number부터 시작해 n보다 클 때까지만 반복

1. temp%n에 해당하는 문자(0~F)를 stack에 push
2. temp는 temp/n으로 갱신
3. temp가 n보다 작거나 같아지면 stack에 push

※ temp와 number의 차이를 구분하기! (에러의 원인)

 

Stack<String> stack = new Stack<>();
int temp = number;
while(temp >= n){
    stack.push(list[temp%n]);
    temp = temp/n;
}
stack.push(list[temp]);
while(!stack.empty() && index < size)   answer[index++] = stack.pop();

 

(2) 튜브가 말할 숫자만 선택

: p, m+p, 2m+p, ... , (t-1)m+p 번째에 해당하는 숫자를 말하게 된단

→ allList[i*m+p -1]을 추가

 

※ 인덱스 = 순서-1임을 주의

 

 

 

 

 

 

 

3. 참고사항

(1) 진법 변환 함수

Integer.toString(int base, int radix) : 바로 진법으로 변경이 가능하다

→ 변환된 길이에 따라서 조건을 체크하여 훨씬 간편하게 구할 수 있다!!

 

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

    int start = 0;

    String target = "";
    String temp = "";

    while (target.length() < m * t) {
        target += Integer.toString(start++, n);
    }

    for (int i=0; i<t; i++) {
        temp += target.charAt(p - 1 + i * m);
    }

      answer = temp.toUpperCase();


      return answer;
  }
}

 

 

 

 

 

 

4. 코드

import java.util.Stack;

class Solution {
    public String solution(int n, int t, int m, int p) {
        String answer = "";
        String[] allList = getAll(n, t*m);
        for(int i = 0; i < t; i++){
            answer += allList[i*m+p-1];
        }
        return answer;
    }
    
    public String[] getAll(int n, int size){
        String[] list = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"};
        String[] answer = new String[size];
        int index = 0; int number = 0;
        while(index < size){
            Stack<String> stack = new Stack<>();
            int temp = number;
            while(temp >= n){
                stack.push(list[temp%n]);
                temp = temp/n;
            }
            stack.push(list[temp]);
            while(!stack.empty() && index < size)   answer[index++] = stack.pop();
            number++;
        }
        return answer;
    }
}
Comments