정수 배열 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, 756, 89] | [58, 172, 756, 89] |
😀 내가 푼 답
const solution = (arr) => {
let length = arr.length
const isPowerOfTwo = (num) => (num & (num - 1)) === 0
while (!isPowerOfTwo(length)) {
arr.push(0);
length++;
}
return arr
}
- 비트 연산자
- 비트 연산자는 숫자의 이진수 비트 단위로 작업을 수행하는 연산자
- 주요 비트 연산자 종류
- AND(&)
- 두 비트가 모두 1일 때 결과가 1이 됨
ex. 5 & 3 -> 5(0101) 3(0011) 따라서 0101 & 0011 = 0001 (결과 1)
- 두 비트가 모두 1일 때 결과가 1이 됨
- OR(|)
- 두 비트 중 하나라도 1이면 결과가 1이 됨
ex. 5 | 3 -> 5(0101) 3(0011) 따라서 0101 | 0011 = 0111 (결과 7)
- 두 비트 중 하나라도 1이면 결과가 1이 됨
- XOR(^)
- 두 비트가 서로 다를 때 결과가 1이 됨
ex. 5 ^ 3 -> 5(0101) 3(0011) 따라서 0101 ^ 0011 = 0110 (결과 6)
- 두 비트가 서로 다를 때 결과가 1이 됨
- NOT(~)
- 비트를 반전시킴 -> 1을 0으로 0을 1로
ex. ~5 -> ~0101 = 1010(보수 연산을 수행하기 때문에 결과는 -6)
- 비트를 반전시킴 -> 1을 0으로 0을 1로
- 왼쪽 시프트(<<)
- 비트를 왼쪽으로지정한 횟수만큼 이동시키고, 오른쪽 빈 자리는 0으로 채움
ex. 5 << 1 -> 0101 << 1 = 1010 (결과 10)
- 비트를 왼쪽으로지정한 횟수만큼 이동시키고, 오른쪽 빈 자리는 0으로 채움
- 오른쪽 시프트(>>)
- 비트를 오른쪽으로 지장한 횟수만큼 이동시키고, 왼쪽 빈 자리는 부호 비트로 채움
ex. 5 >> 1 -> 0101 << 1 = 0010 (결과 2)
- 비트를 오른쪽으로 지장한 횟수만큼 이동시키고, 왼쪽 빈 자리는 부호 비트로 채움
- 부호 없는 오른쪽 시프트(>>>)
- 비트를 오른쪽으로 지정한 횟수만큼 이동시키고, 왼쪽 빈 자리는 0으로 채움
- 부호에 상관없이 양수로 처리
ex. -5 >>> 1- -5는 부호 비트에 포함해 이진수로 표한하면 32비트의 큰 수가 되는데, 이 값을 오른쪽으로밀고 왼쪼긍로 0으로 채워 양수로 변환함
- AND(&)
- 비트 연산의 특징
- 비트 연산은 단순한 논리 연산에 비해 속도가 빠르고 효율적
- 주로 성능이 중요한 곳에서 사용되며, 시스템 프로그래밍,암호화, 그래픽 처리 등에서 활용됨
- 비트를 조작하여 메뫼나 값을 최적화하는 데 유용함
- (num & (num - 1)
- num과 num - 1의 비트 논리곱(AND)연산
- 2의 거듭제곱인 숫자는 항상 하나의 비트만이 1로 설정되어 있음
ex. 8 이진수로 1000, 4 이진수로 0100 - 2의 거듭제곱에서 num - 1을 하면, 2의 거듭제곱 자리보다 하위 모든 비트가 1로 채워짐
ex. 7 이진수로 0111 - num과 num - 1을 AND 연산하면, 두 비트가 겹치는 부분이 없어서 0이 됨
- (num & (num - 1)) === 0은 num이 2의 거듭제곱일 때만 참이 됨
😊 문제풀이 답안 OR 다른사람들 답안
function solution(arr) {
const length = arr.length;
const totalLength = 2 ** Math.ceil(Math.log2(length));
return [...arr, ...new Array(totalLength - length).fill(0)];
}
'공부 > 코딩테스트' 카테고리의 다른 글
Q. 숨어있는 숫자의 덧셈 (2) (0) | 2024.12.16 |
---|---|
Q. 이차원으로 만들기 (0) | 2024.04.01 |
Q. 중복된 문자 제거 (0) | 2024.04.01 |
Q. 최대값 만들기(2) (0) | 2024.02.26 |
Q. 주사위의 개수 (0) | 2024.02.26 |