n,t,m,p 가 순차적으로 매개변수로 주어진다.
각 매개변수의 의미는 다음과 같다.
위 정보들을 토대로, 튜브가 외쳐야할 숫자들을 t개 미리 구하면 된다.
잘 생각해보면, 그냥 숫자 0부터 시작해서 계속 n진수로 변환한 값을 results배열에 char단위로 한글자씩 집어넣고, 튜브의 순서에 대응하는 인덱스들을 차례로 순회하면서 t개 선택하면 된다.
이때, n진수로 변환하는 과정에서 스택을 쓰면 좀 더 시간복잡도 측면에서 효율적인 처리를 할 수 있다.
나같은 경우는 t*m 개의 차례에 불러야 할 숫자의 정보들을 미리 구했다.
import java.util.*;
class Solution {
public String solution(int n, int t, int m, int p) {
StringBuilder sb = new StringBuilder();
int targetSize = t * m;
ArrayList<Character> results = new ArrayList();
int size = 1;
int number = 1;
results.add('0');
while (size < targetSize) {
Stack<Character> st = new Stack();
int num = number;
while (num > 0) {
int remain = num % n;
num = num / n;
if (remain >= 10) {
st.push((char) ('A' + remain - 10));
} else {
st.push((char) ('0' + remain));
}
}
size += st.size();
while (!st.isEmpty()) {
results.add(st.pop());
}
number++;
}
for (int i = p - 1, c=0; i < size && c<t; i += m, c++) {
sb.append(results.get(i));
}
return sb.toString();
}
}
