Study with me/프로그래머스 L0 마스터하기

프로그래머스 - L0 배열의길이를2의거듭제곱으로만들기

외계나무 2024. 4. 3. 10:41

프로그래머스 - level 0 배열의 길이를 2의 거듭제곱으로 만들기

1. 일단은 Brute-force로

이중 for문 참 싫어하는데 걍 씀... 이건 Brute-force니까..

진짜 단순하게 for문 돌리면서 배열의 길이가 2의 거듭제곱이면 그대로 넘기고, 아니면 새로 배열 만들어서 (정수 배열은 처음 만들면 기본적으로 각 요소의 값이 0이니까) 기존 배열 요소 복붙하는 정말 단순한 코드... 

class Solution {
    public int[] solution(int[] arr) {
        int len = arr.length;
        int[] answer;
        for(int i=1; i<=10; i++) {
            int k = (int)Math.pow(2, i);
            if(len == k) {
                return arr;
            } else if(len < k) {
                answer = new int[k];
                for(int j=0; j<len; j++) {
                    answer[j] = arr[j];
                }
                return answer;
            }
        }
        return arr;
    }
}

그런데... 마지막 테스트 케이스를 통과하지 못했다.

...?

뭐여?? 뭔데???

테스트 케이스 정말 궁금하다...

마지막 return arr;이 문제인가 싶기는 한데, 대체 무슨 테스트 케이스가 있어야 저게 걸리는지 짐작이 안 감.

=> 짜잔 답은 첫 for문에서 i=0 부터 였습니다~~~ 에라이...

2의 0제곱은 1... 내 수학 지식의 패배... 생각해내는데 2분 걸렸다는 점에서 위안을 얻기로 해본다.

참고로, while 쓰려다 for 쓴 이유는 어차피 배열 arr의 길이가 1000을 안 넘는다는 게 조건으로 주어져서 그렇다. 그렇다면 answer의 길이는 최대 2의 10제곱인 1024일 테니까. for 루프가 while 보다 빠르다는 이야기도 있는데, 여기서는 어차피 크게 차이가 없을거라 그거랑은 상관 없었음.

 

2. 이중 for문과 이별하기

어쨋든 이제 코드를 고쳐본다. 우선 이중 for문 없애버리기.

사용한 메서드는 arraycopy()로, 기본 제공 클래스인 System 메서드라서 따로 import는 필요 없다. 마치 라잌 println..

파라미터는, System.arraycopy( 원본배열, 복사할시작인덱스, 새로운배열, 복사받을시작인덱스, 복사할길이 );

 

class Solution {
    public int[] solution(int[] arr) {
        int len = arr.length;
        int[] answer;
        for(int i=0; i<=10; i++) {
            int k = (int)Math.pow(2, i);
            if(len == k) {
                return arr;
            } else if(len < k) {
                answer = new int[k];
                System.arraycopy(arr, 0, answer, 0, len);
                return answer;
            }
        }
        return arr;
    }
}

 덧붙여, chatGPT에 따르면, "System.arraycopy()는 배열을 복사할 때 for 루프를 사용하는 것보다 성능이 더 우수합니다. 이는 네이티브 메서드로 구현되어 있기 때문입니다. 따라서 대량의 데이터를 복사하는 경우에 효율적으로 사용할 수 있습니다." 라고 한다. 네이티브 메서드는 ' 특정 플랫폼의 기계어로 작성된 코드'로 C, C++ 같은 로우 레벨 언어로 구현되어 있다고 하는데, 정확하게 이해는 못했지만 C / C++이 속도면에서는 우수해서 코테에서 일부 선호되는 언어라는 소리는 들어보았기에 납득했다.

다른 사람들의 풀이를 보니 Arrays 클래스의 메서드 쓴 게 많네. copyOf나, copyOfRange.. 근데 오늘은 안 때기니까 패스ㅎ