[프로그래머스] Lv.0 배열의 길이를 2의 거듭제곱으로 만들기

이다혜·2023년 11월 8일
0

프로그래머스

목록 보기
51/61
post-thumbnail

📎 문제 출처


https://school.programmers.co.kr/learn/courses/30/lessons/181857

📌 문제 설명


정수 배열 arr이 매개변수로 주어집니다. arr의 길이가 2의 정수 거듭제곱이 되도록 arr 뒤에 정수 0을 추가하려고 합니다. arr에 최소한의 개수로 0을 추가한 배열을 return 하는 solution 함수를 작성해 주세요.

❓ 풀이 방법


  1. 내 풀이 방법
    arr의 길이가 최대 1000이니까 2의 제곱수들을 1024까지 배열에 저장해두고 반복문에서 arr의 길이와 제곱수를 비교해서 배열의 길이보다 작은 제곱수를 찾으면 그 수와의 차만큼 0을 추가했다.

    그런데 다른 사람의 풀이를 보니 훨씬 간단하게 푸는 방법이 있었다.

  2. 다른 사람의 풀이 방법
    1로 초기화한 변수에 반복문을 통해 2를 곱한다.
    2를 계속 곱하다가 배열의 길이보다 커지는 순간 멈춘다.
    멈춘 수만큼의 길이인 배열을 생성하는데 이때 copyOfRange() 메서드를 사용한다. 기존의 배열 값이 복사되고 남는 부분은 default 값인 0이 자동으로 저장된다.

📌 Code


  1. 내 풀이 코드
import java.util.*;
class Solution {
    public int[] solution(int[] arr) {
        int len = arr.length;
        int[] pow = new int[11];
        for(int i = 0; i < 11; i++) {
            pow[i] = (int)Math.pow(2, i);
        }
        
        int diff = 0;
        for(int i = 0; i < 11; i++) {
            if(len <= pow[i]) {
                diff = pow[i] - len;
                break;
            }
        }
        
        ArrayList<Integer> list = new ArrayList<>();
        for(int a : arr) list.add(a);
        
        for(int i = 0; i < diff; i++) list.add(0);
        
        int[] answer = new int[list.size()];
        for(int i = 0; i < answer.length; i++) answer[i] = list.get(i);
        return answer;
    }
}
  1. 다른 사람의 풀이 코드
import java.util.*;

class Solution {
    public int[] solution(int[] arr) {
        int len = arr.length;
        int tmp = 1;
        
        while(tmp < len) {
            tmp *= 2;
        }
        
        return Arrays.copyOfRange(arr, 0, tmp);
    }
}

0개의 댓글