[프로그래머스] 배열의 길이를 2의 거듭제곱으로 만들기

LSA·5일 전
0

javascript+a

목록 보기
5/8
post-thumbnail

문제 링크

문제 설명

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

입출력 예

arrresult
[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을 추가해주는 방식으로 풀었다.

profile
진짜 간단하게 작성한 TIL 블로그

0개의 댓글

관련 채용 정보