- 숫자를 0부터 시작해서 차례대로 말한다. 첫 번째 사람은 0, 두 번째 사람은 1, … 열 번째 사람은 9를 말한다.
- 10 이상의 숫자부터는 한 자리씩 끊어서 말한다. 즉 열한 번째 사람은 10의 첫 자리인 1, 열두 번째 사람은 둘째 자리인 0을 말한다.
Integer.toString(int i, int radix) 을 안다면 쉬운 문제이다.
i를 radix진법으로 바꾼 결과를 String으로 변환한다.
while (target.length() < t * m) {
target.append(Integer.toString(num++, n));
}
StringBuilder을 사용해서 원하는 index의 값들을 뒤에 이어붙인다.
for (int i = p - 1; result.length() < t; i += m) {
result.append(target.charAt(i));
}
사실 이번 포스트를 준비한 이유는 String -> StringBuilder을 사용한 최적화다.
immutable 객체이기 때문에 target += something이 실행될 때마다 새로운 String 객체가 생성된다.mutable객체인 StringBuilder을 사용하자개선 이전
String target = "";
int current = 0;
for (int i = p - 1; sb.length() < t; i += m) {
while (target.length() <= i) {
target += Integer.toString(current, n); // 계속 새로운 객체 생성
current++;
}
개선 이후
while (target.length() < t * m) { // 전체 게임에 필요한 길이만큼 미리 생성
target.append(Integer.toString(num++, n));
}
charAt도 사용할 수 있다!
for (int i = p - 1; result.length() < t; i += m) {
result.append(target.charAt(i));
}
개선된 성능

속도 차이가 많이 나는 것을 볼 수 있다.