코딩테스트

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

오쟝 2023. 12. 21. 08:44

 

처음 생각한 방법은 ArrayList를 사용해 arr의 값을 옮겨준 다음 list의 길이가 2의 거듭제곱보다 작을 때의 거듭제곱을 구해 list에 거듭제곱이 될 때까지 0을 넣는 방법이었습니다!

 

처음에 ArrayList에 arr의 값을 옮겨주고~

ArrayList <Integer> list = new ArrayList<>();
for(int n : arr) list.add(n);

 

Math.pow()를 사용해 2의 거듭제곱과 list의 길이를 비교했습니다!

int res = 0;
for(int i = 0; i<=10; i++){
    if(list.size() <= (int)Math.pow(2, i)){
        res = (int)Math.pow(2, i);
        break;
    }
}

 

list보다 크면서 가장 작은 2의 거듭제곱을 구해야하기 때문에 2의 거듭제곱이 list의 길이보다 크거나 같으면 바로 break를 해주었습니다!

 

마지막으로 res보다 작을 때 0 list에 0을 넣어주었습니다!

for(int i = 0; i<res; i++){
    if(list.size() < res) list.add(0);
}

 

이렇게 하면 최종 코드는~

import java.util.*;
class Solution {
    public int[] solution(int[] arr) {
        ArrayList <Integer> list = new ArrayList<>();
        for(int n : arr) list.add(n); 

        int res = 0;
        for(int i = 0; i<=10; i++){
            if(list.size() <= (int)Math.pow(2, i)){
                res = (int)Math.pow(2, i);
                break;
            }
        }
        for(int i = 0; i<res; i++){
            if(list.size() < res) list.add(0);
        }
        int[] answer = new int[list.size()];
        int i = 0;
        for(int n : list) answer[i++] = n;
        return answer;
    }
}

 

가 됩니다! 하지만.. 너무 코드가 복잡하고 더럽지 않나요?

다른 분의 코드를 보던 중 훨씬 쉽고 간단한 코드를 발견했습니다!

똑같이 Math.pow()를 사용해 가장 작은 2의 거듭제곱을 구했지만 Arrays.copyOf를 사용해 ArrayList를 만들고 값을 넣어주는 과정을 생략했습니다!

import java.util.*;
class Solution {
    public int[] solution(int[] arr) {
        int length = 1;
        while(true) {
            if(length >= arr.length) break;
            length *= 2;
        }
        return Arrays.copyOf(arr, length);
    }
}

 

length를 1로 정하고, arr의 길이보다 크거나 같으면 break를 해주는데 그게 아니라면 length를 거듭제곱해줍니다!

마지막으로 Arrays.copyOf를 사용해 arr를 length 길이만큼 늘려주고 빈 공간에는 0을 넣어줍니다!

 

저도 실력을 키워 깔끔한 코드를 적어야겠습니다!

 

결과는~ 

정답~~

그럼 20000~ ^o^