본문 바로가기

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

알고리즘/0단계

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

개발자로 거듭나기 2023. 6. 4. 17:50
반응형

0 단계 : 배열의 길이를 2의 거듭제곱으로 만들기

코딩테스트 연습 > 코딩 기초 트레이닝 > 배열의 길이를 2의 거듭제곱으로 만들기


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


제한사항
  • 1 ≤ arr의 길이 ≤ 1,000
  • 1 ≤ arr의 원소 ≤ 1,000

입출력 예
arr result
[1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6, 0, 0]
[58, 172, 746, 89] [58, 172, 746, 89]

입출력 예 설명

입출력 예 #1

  • 예제 1번의 arr의 길이는 6입니다. arr의 길이를 2의 정수 거듭제곱으로 만드는 방법은 0을 2개, 10개, 26개,..., 추가하는 방법이 있고 그중 최소한으로 0을 추가하는 방법은 2개를 추가하는 것입니다. 따라서 [1, 2, 3, 4, 5, 6, 0, 0]을 return 합니다.


입출력 예 #2

  • 예제 2번의 arr의 길이는 4이고 이미 2의 정수 거듭제곱입니다. 따라서 뒤에 0을 추가하지 않아도 되므로 [58, 172, 746, 89]를 return 합니다.

코드

function solution(arr) {
    const isTwo = (num) => {
        return (num & (num - 1)) === 0;
    }
    
    let len = arr.length;
    while(1) {
        if(isTwo(len)) break;
        else len++;
    }
    
    if(arr.length === len) return arr;
    else {
        const extra = Array(len - arr.length).fill(0);
        return [...arr, ...extra];
    }
}

리뷰

1. isTwo 함수의 역할은 숫자를 input으로 받아서 숫자가 2의 거듭제곱인지 아닌지 판별합니다.
2. 그 원리는 8을 예로들었을 때 8 = 1000(2) 7 = 0111(2) 했을때 &비트 연산이 들어가면 전부 1이되야 2의 거듭제곱 수 입니다.
3. 오직 2의 거듭제곱숫자는 첫자리가 1이고 나머지는 다 0이고, 그 전숫자는 전부 1입니다.
4. 2의 거듭제곱 최소 숫자를 구했다면 부족한 갯수만큼 0을 추가시켜서 return 하면 됩니다.

총평 : isTwo 함수만 구현이 된다면 나머지는 쭉 풀릴 것이라 생각합니다.


출처 : https://school.programmers.co.kr/learn/courses/30/lessons/181857
반응형
Comments