2026.08.15
소요 시간: 16분
시간 복잡도:
class Solution {
public String solution(int n, int t, int m, int p) {
StringBuilder sb = new StringBuilder();
int idx = 0;
int order = 1;
while(sb.length() < t) {
String number = Integer.toString(idx, n);
number = number.toUpperCase();
for (int i = 0; i < number.length(); i++) {
if (order == p) {
sb.append(number.charAt(i));
if (sb.length() == t) {
break;
}
}
order = order % m + 1;
}
idx++;
}
return sb.toString();
}
}
시간 복잡도:
코드 분석
필요한 n진수 전부를 미리 tube에 저장해두고,
튜브의 순서에 필요한 수만 따로 빼서 저장
class Solution {
public String solution(int n, int t, int m, int p) {
// 1) 필요한 만큼만 튜브 생성: 마지막으로 읽을 위치는 (t-1)*m + p ≤ t*m
StringBuilder tube = new StringBuilder();
for (int i = 0; tube.length() < t * m; i++) {
tube.append(Integer.toString(i, n).toUpperCase());
}
// 2) p번째(1-based)부터 m칸씩 t개 뽑기
StringBuilder answer = new StringBuilder();
for (int i = p - 1; answer.length() < t; i += m) {
answer.append(tube.charAt(i));
}
return answer.toString();
}
}
수학적인 계산이 코드 길이에 얼마나 큰 영향을 주는지 알 수 있었다.
필요한 n진수를 미리 계산하는 과정을 통해서,
각 숫자마다 String을 2개씩 할당하는 과정을 없앴다.