[프로그래머스] Lv.2 n진수 게임 JAVA 풀이
문제 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
* 독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *