본문 바로가기
Programmers/Lv.2

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

by Poorm 푸름 2023. 11. 15.

문제 Lv.2 n진수 게임 

 :  여러사람이 둥글게 앉아 숫자를 차례대로 말하기

 

 :  숫자 0부터 시작해서 순서대로 말하고 10 이상부터는 한자리씩의 숫자만 말하기 
   (예 10을 한명이 아닌 두명이 나눠서 말하는 것)

 

 :  이진수로 말하기도 가능 (0, 1, 1|0, 1|1, 1|0|0,,, 한자리수씩 끊어 읽기)

 

 : 입력: 진법 n, 구할 숫자 개수 t, 게임에 참가하는 인원 m, 튜브 순서 p

             2 ≦ n ≦ 16   /   0 < t ≦ 1000   /   2 ≦ m ≦ 100   /   1 ≦ p ≦ m

 

 

<정답 예시>

 

1)  0 (= 0), 1 (= 1), 10 (= 2), 11 (= 3), 100 (= 4) 중 2명이 말하는데 그 중 첫번째 순서만 구해라

     A: 0

     B: 1

     A: 1 - B: 0  

     A: 1 - B: 1

     A: 1 - B: 0 - A: 0 

 

   RESULT = A가 1번째 순서이므로 A = (0,1,1,1) 출력

 

 

2)  0 (= 0), 1 (= 1), 2 (= 2), 3 (= 3), 4 (= 4), 5 (= 5), 6 (= 6), 7 (= 7), 8 (= 8), 9 (= 9),
     A (= 10), B (= 11), C (= 12), D (= 13), E (= 14), F (= 15),

    10 (= 16), 11 (= 17), 12 (= 18), 13 (= 19), 14 (= 20), 15 (= 21), 16 (= 22), 17 (= 23) 
    중 2명이 말하는데 첫번째 순서만 구해라

 

     A: 0  B: 1  A: 2   B: 3  A: 4   B: 5  A: 6   B: 7  A: 8   B: 9 

     A: A   B: B   A: C   B: D   A: E   B: F  

     A: 1 -  B: 0   A: 1 -  B: 1   A: 1 -  B: 2   A: 1 - B: 3   A: 1 -  B: 4   A: 1 -  B: 5   · · · · ·

    

   RESULT = A가 1번째 순서이므로 A = (0,2,4,6,8,A,C,E,1,1,1,1,1,1,1,1) 출력

   

n t m p result
2 4 2 1 0111
16 16 2 1 02468ACE11111111
16 16 2 2 13579BDF01234567

 

10진수 16진수 2진수
0 0 0
1 1 1
2 2 10
3 3 11
4 4 100
5 5 101
6 6 110
7 7 111
8 8 1000
9 9 1001
10 A 1010
11 B 1011
12 C 1100
13 D 1101
14 E 1110
15 F 1111

 

 

[알아두기]

 < Integer.toString(num, n) >

 

  • (10진법, 바꾸고 싶은 n진법)
  • 10진법을 자신이 바꾸고싶은 진법으로 변환시켜주는 기능

  • 반대로 N진법을 10진법으로 변환하려면 Integer.parseInt(str, n) 함수 사용

 

 

 < toUpperCase >

 

  • 모든 문자열을 대문자로 변환

 

 

[코드]

class Solution {
    public String solution(int n, int t, int m, int p) {
       StringBuilder num = new StringBuilder(); 
        StringBuilder result = new StringBuilder();
        
       for(int i = 0; num.length() <= t * m; i++){
            num.append(Integer.toString(i, n).toUpperCase());
        }
      
        for(int i = p - 1;  result.length() < t; i += m){
            result.append(num.charAt(i));
        }
        
        return result.toString();
 
    }
}

 

 :  StringBuilder num = new StringBuilder();  숫자 모아보기
    StringBuilder result = new StringBuilder();  결과
        
 :  for(int i = 0; num.length() <= t * m; i++){  골라서 내보낼 숫자들의 집합  넉넉잡아 (t*m개 만큼까지)
           num.append(Integer.toString(i, n).toUpperCase());  숫자 n진법으로 변환

     }
     

 :  for(int i = p - 1;  result.length() < t; i += m){
            result.append(num.charAt(i));
     }
        
 :  return result.toString();  결과 출력
 

 

 

[시간 복잡도]

 

for문을 2개 사용

첫번째 for문이 t*m만큼 두번째 for문이 t만큼 돌기 때문에 시간복잡도는 O(t*m) + O(t) 이다

 

 

 

 

 

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

 

프로그래머스

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

programmers.co.kr

 

 

* 독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *