배열의 길이를 2의 거듭제곱으로 만들기 JAVA
문제 설명 : 정수 배열 arr이 매개변수로 주어집니다. arr의 길이가 2의 정수 거듭제곱이 되도록 arr 뒤에 정수 0을 추가하려고 합니다. arr에 최소한의 개수로 0을 추가한 배열을 return 하는 solution 함수를 작성해 주세요.
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/181857
자바 코드 :
import java.util.Arrays;
class Solution {
public int[] solution(int[] arr) {
int[] answer = {};
if( (arr.length & (arr.length - 1)) == 0 ) { // 비트 연산자를 활용한 2의 제곱 지수 확인
answer = Arrays.copyOfRange(arr, 0, arr.length);
} else {
int endIndex = (int) Math.pow(2, powTest(arr.length));
answer = Arrays.copyOfRange(arr, 0, endIndex);
}
return answer;
}
public int powTest(int num){
int exponentiation = 0;
while(Math.pow(2, exponentiation) <= num ){
exponentiation++;
}
return exponentiation;
}
}
비트 연산!
((arr.length & (arr.length - 1)) == 0) 이 부분은 비트 연산을 사용하여, 주어진 숫자가 2의 지수인지를 확인하는 부분입니다. 여기서 &는 비트 AND 연산자를 나타냅니다.
arr.length - 1은
arr.length의 비트를 뒤집습니다.
예를 들어, arr.length 가 8이라면
8의 경우 비트로는 1000이고, 8 - 1은 0111이 됩니다.
arr.length & ( arr.length - 1)은
arr.length 과 arr.length - 1을 비트 AND 연산합니다.
이 결과가 0이라면 주어진 숫자는 2의 지수입니다.
이렇게 함으로써, 주어진 숫자가 2의 지수인지를 판별합니다.
예를 들어, 8의 경우:
8은 이진수로 1000이고,
7은 이진수로 0111입니다.
그리고 1000 & 0111은 0이 되므로, 8은 2의 지수입니다.
arr.length 의 길이가 2의 지수인지 여부를 확인할 수 있습니다.
Math.pow를 활용!
powTest 메소드를 만들어서 매개변수로 받은 arr.length의 길이값을 Math.pow()를 활용하여 2의 몇 제곱이 되는지 확인합니다.
powTest() 메소드에서 return 한 값에 다시 Math.pow(2, result)를 해주면, endIndex 를 얻을 수 있고, Arrays.copyOfRange() 메소드를 통해 arr 배열을 answer 배열에 복사를 해주면서 자연스럽게 0을 추가해줍니다!