개발/알고리즘(코딩테스트)

프로그래머스, 자바스크립트) 배열의 길이를 2의 거듭제곱으로 만들기

빔네모 2024. 1. 17. 12:47

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

log2를 취해서 정수인지 판별해서 맞다면 그대로 리턴

아닐 경우, log2를 취한 후 올림해 가장 가까운 자연수를 뽑아 제곱수를 구한다. 

2.xx => Math.pow(2,3) => 8. 구한 숫자와 원래 배열의 길이의 차가 필요한 0의 개수가 된다. 

function solution(arr) {
  //요소의 수
  const total = arr.length;
  //2의제곱인지 판별해서 맞다면 리턴
  if (Number.isInteger(Math.log2(total))) return arr;

  //필요한 제곱수
  const square = Math.pow(2, Math.ceil(Math.log2(total)));

  return [...arr, ...new Array(square - total).fill(0)];
}

 

다른풀이

배열의 길이가 2의 거듭제곱이 될때까지 0을 추가한다. 

 

& 비트 연산자에 대한 이해 

2의 거듭제곱인지 확인하기 위해서는 그 수에 대한 이진수 표현에서 가장 높은 자리 비트만 1이어야 합니다. 2의 거듭제곱에서 1을 뺀 값은 그 이진수 표현에서 가장 높은 자리 비트를 제외한 나머지 비트를 모두 1로 만듭니다. 따라서 arr.length & (arr.length - 1)이 0이면 배열의 길이가 2의 거듭제곱이라는 것이고, 0이 아니면 2의 거듭제곱이 아니라는 것을 나타냅니다.

function solution(arr) {
  const length = arr.length;

  // 주어진 배열의 길이가 2의 정수 거듭제곱이 될 때까지 0을 추가
  while ((arr.length & (arr.length - 1)) !== 0) {
    arr.push(0);
  }

  return arr;
}