공부/코딩테스트

Q. 배열의 길이를 2의 거듭제곱으로 만들기

뀨뿌뀨뿌 2024. 10. 14. 16:53

정수 배열 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)
      • OR(|)
        • 두 비트 중 하나라도 1이면 결과가 1이 됨
          ex. 5 | 3 -> 5(0101) 3(0011)  따라서 0101 | 0011 = 0111 (결과 7)
      • XOR(^)
        • 두 비트가 서로 다를 때 결과가 1이 됨
          ex. 5 ^ 3 -> 5(0101) 3(0011)  따라서 0101 ^ 0011 = 0110 (결과 6)
      • NOT(~)
        • 비트를 반전시킴 -> 1을 0으로 0을 1로
          ex. ~5 -> ~0101 = 1010(보수 연산을 수행하기 때문에 결과는 -6)
      • 왼쪽 시프트(<<)
        • 비트를 왼쪽으로지정한 횟수만큼 이동시키고, 오른쪽 빈 자리는 0으로 채움
          ex. 5 << 1 ->  0101 << 1 = 1010 (결과 10)
      • 오른쪽 시프트(>>)
        • 비트를 오른쪽으로 지장한 횟수만큼 이동시키고, 왼쪽 빈 자리는 부호 비트로 채움
          ex. 5 >> 1 ->  0101 << 1 = 0010 (결과 2)
      • 부호 없는 오른쪽 시프트(>>>)
        • 비트를 오른쪽으로 지정한 횟수만큼 이동시키고, 왼쪽 빈 자리는 0으로 채움
        • 부호에 상관없이 양수로 처리
          ex. -5 >>> 1
          • -5는 부호 비트에 포함해 이진수로 표한하면 32비트의 큰 수가 되는데, 이 값을 오른쪽으로밀고 왼쪼긍로 0으로 채워 양수로 변환함
    • 비트 연산의 특징
      • 비트 연산은 단순한 논리 연산에 비해 속도가 빠르고 효율적
      • 주로 성능이 중요한 곳에서 사용되며, 시스템 프로그래밍,암호화, 그래픽 처리 등에서 활용됨
      • 비트를 조작하여 메뫼나 값을 최적화하는 데 유용함
  • (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