문제
https://school.programmers.co.kr/learn/courses/30/lessons/181857
풀이
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;
}
'개발 > 알고리즘(코딩테스트)' 카테고리의 다른 글
프로그래머스, 자바스크립트) 커피 심부름 (1) | 2024.01.18 |
---|---|
프로그래머스, 자바스크립트) 리스트 자르기 (0) | 2024.01.18 |
프로그래머스, 자바스크립트) 7의 개수 (0) | 2024.01.16 |
프로그래머스, 자바스크립트) 컨트롤 제트 (0) | 2024.01.16 |
프로그래머스, 자바스크립트) 2의 영역 (0) | 2024.01.16 |