알고리즘/PS - 프로그래머스

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

excited-hyun 2021. 8. 30. 15:41
반응형

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

 

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

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

programmers.co.kr

 

풀이

이 문제에서는 우선 진법 변환부터 해주고 그 진법 변환한 문자열을 모두 이어붙여주는 것으로 시작합니다.

사실 이부분만 하면 다 푼거나 다름 없습니다.

 

  1. 우선은 진법 변환에 쓸 HashMap부터 만들어 줍니다. 16진수가 최대이므로 0~15까지 의 키를 갖도록 생성했습니다.
  2. 전체 진법 변환 문자열을 저장할 total이라는 문자열에 첫번째 수인 0 이 변환된 "0"을 넣어주고 그 다음 수인 1부터 코드 상으로 진법 변환을 해 이어 붙여줍니다.
  3. 그렇게 진법 변환을 하며 생성한 total 문자열의 길이가 m*t이상이 될 때 까지 이를 반복합니다.
  4. 그런 뒤 for(i=0; i<t; i++) 루프를 이용해서 answer문자열에 m*i+p-1번째 문자만 연결해줍니다.

위와 같은 간단한 방법으로 풀리는 문제입니다.

 

import java.util.*;

class Solution {
    public String solution(int n, int t, int m, int p) {
        HashMap <Integer, String> m1 = new HashMap<Integer, String> ();
        m1.put(0, "0"); m1.put(1, "1"); m1.put(2, "2"); m1.put(3, "3");
        m1.put(4, "4"); m1.put(5, "5"); m1.put(6, "6"); m1.put(7, "7");
        m1.put(8, "8"); m1.put(9, "9"); m1.put(10, "A"); m1.put(11, "B");
        m1.put(12, "C"); m1.put(13, "D"); m1.put(14, "E"); m1.put(15, "F");
        
        
        String answer = "";
        int num = 1;
        String total = "0";    //진법 변환한 값 이어붙임
        int cnt = 1;         //total길이
        while(true){
            int len = 0;        //변환한 길이
            String tmp = "";    //num 진법 변환
            int now = num;
            //진법 변환
            while(now > 0) {
                int r = now % n;
                now = now / n;
                tmp = m1.get(r) + tmp;
                len ++;
            }
            total = total + tmp;
            cnt += len;
            num++;
            
            //total의 길이가 m*t에 도달함
            if(cnt >= m*t)
                break;
        }
        
        //t개 뽑기
        for(int i=0; i<t; i++){
            answer += total.charAt(m*i + p -1);
        }
        return answer;
    }
}

 

 

728x90
반응형