[프로그래머스] [3차] n진수 게임 - JAVA

공부용·2025년 10월 12일
post-thumbnail

문제 사이트

  1. 숫자를 0부터 시작해서 차례대로 말한다. 첫 번째 사람은 0, 두 번째 사람은 1, … 열 번째 사람은 9를 말한다.
  2. 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));
        }

immutable(불변)

사실 이번 포스트를 준비한 이유는 String -> StringBuilder을 사용한 최적화다.

  • 자바의 String은 immutable 객체이기 때문에 target += something이 실행될 때마다 새로운 String 객체가 생성된다.
  • 변경되는 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));
        }

개선된 성능

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

profile
공부 내용을 가볍게 적어놓는 블로그.

0개의 댓글