문제 설명
정수 배열 arr이 매개변수로 주어집니다. arr의 길이가 2의 정수 거듭제곱이 되도록 arr 뒤에 정수 0을 추가하려고 합니다. arr에 최소한의 개수로 0을 추가한 배열을 return 하는 solution 함수를 작성해 주세요.
입출력 예
arr result [1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6, 0, 0] [58, 172, 746, 89] [58, 172, 746, 89]
입출력 예를 보면 알 수 있듯이 파라미터로 들어온 arr
의 개수가 2의 제곱수가 되어야 한다는 것이다.
2의 제곱수는 대략 아래와 같다.
2 x 2 = 4
4 x 2 = 8
8 x 2 = 16
.
.
.
그래서 arr
의 개수가 2의 제곱수가 되도록 배열 개수를 늘려 주어야 하고, 배열을 늘리기 위해 임의의 숫자 0을 추가하도록 조건을 건 것.
function solution(arr) {
let array = arr;
let length = arr.length;
// 매개변수로 받은 숫자가 2의 제곱수인지 확인하는 함수를 따로 만듬
const returnArray = (num) => {
return !(num & (num - 1));
}
//true가 될 때까지 while문을 돌렸습니다.
while(true){
//returnArray(length)가 true면 array를 리턴
if(returnArray(length)) return array;
array.push(0);
length++;
//length는 사실상 카운팅을 하기 위한 변수인데, 이 코드가 없으면 평생 반복문이 돌게 됨
}
}
어떤 숫자가 2의 제곱인지 아닌지 어떻게 알지? 에서부터 막혔다.
나는 고등학생때부터 수학을 모르기로 유명한 사람이었으므로...
인터넷에는 똑똑한 사람들이 아주 많았으며 비트 연산자 AND(&)를 활용한 방식을 찾았다.
원리는 이 블로그에 적혀 있다.
!(num & (num - 1))
결론적으로, while
반복문에서 returnArray(length)
가 true
가 될 때까지 array
에 0을 추가해주는 방식으로 풀었다.