본문 바로가기

코딩테스트

자바 배열의 길이를 2의 거듭제곱으로 만들기 프로그래머스 코딩테스트

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

 

문제 설명 : 정수 배열 arr이 매개변수로 주어집니다. arr의 길이가 2의 정수 거듭제곱이 되도록 arr 뒤에 정수 0을 추가하려고 합니다. arr에 최소한의 개수로 0을 추가한 배열을 return 하는 solution 함수를 작성해 주세요.

 

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/181857

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

자바 코드 :

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을 추가해줍니다!


 

728x90
300x250