https://school.programmers.co.kr/learn/courses/30/lessons/17687
진법 n, 미리 구할 숫자의 갯수 t, 게임에 참가하는 인원 m, 튜브의 순서 p 가 주어진다.
튜브가 말해야 하는 숫자 t개를 공백 없이 차례대로 나타낸 문자열. 단, 10~15는 각각 대문자 A~F로 출력한다.
2 ≦ n ≦ 16
0 < t ≦ 1000
2 ≦ m ≦ 100
1 ≦ p ≦ m
문제를 이해하는 과정이 제법 어려웠다.
아래와 같은 예제로 이해해보자.
n | t | m | p | result |
---|---|---|---|---|
2 | 4 | 2 | 1 | "0111" |
우선 진법이 2이다.
0, 1, 10, 11, 100, 101, 110, 111, ...
-> 011011100101110111...
그리고 튜브가 미리 알고 있어야 할 숫자가 t개 필요하다.
참가하는 인원이 m이므로, 이진수를 이어붙인 길이가 m x t 만큼 필요하다.
튜브의 순서가 p라고 주어지므로
튜브는 p번째, p+m번째, p+2m번째.. 의 숫자가 필요하다.
타 언어는 우선 진법 변환 작업이 먼저 필요하다.
하지만 JAVA
언어는 아래와 같이 Integer Class에 구현되어 있다..
https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
따라서 로직만 정리하자면 다음과 같다.
1. 구해야할 전체 길이를 구한다.
2. 0부터 n진수로 변환해서 계속 이어붙인다.
3. 튜브의 순서를 고려하여, 숫자를 계속 이어붙인다.
class Solution {
public String solution(int n, int t, int m, int p) {
StringBuilder sb = new StringBuilder();
int max = t * m; // 구해야할 길이
for(int i = 0; sb.length() <= max; ++i){
sb.append(Integer.toString(i, n).toUpperCase()); // n진수로 바꾸고, 문제 조건에 따라 A-F는 대문자로 표현
}
String prepared = sb.toString();
StringBuilder result = new StringBuilder();
// 튜브의 순서에 말할 문자만 더한다.
for(int i = p - 1 ; i < max; i += m)
result.append(prepared.charAt(i));
return result.toString();
}
}