저장을 습관화

프로그래머스 LV.0 배열의 길이를 2의 거듭제곱으로 만들기 본문

코딩 테스트/프로그래머스 - 자바스크립트

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

ctrs 2023. 9. 26. 21:32

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

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

 

프로그래머스

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

programmers.co.kr

 

1. 문제 명

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


2. 문제 설명

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


3. 제한 사항

- 1 ≤ arr의 길이 ≤ 1,000

- 1 ≤ arr의 원소 ≤ 1,000

 

4. 예시

arr result
[1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6, 0, 0]
[58, 172, 746, 89] [58, 172, 746, 89]


5. 기본 제공 코드

function solution(arr) {
    var answer = [];
    return answer;
}


6. 제출한 내 답

const solution = (arr) => {
  let howMany = 1;
  while (arr.length > howMany) {
    if (arr.length <= howMany) {
      break;
    }
    howMany *= 2;
  }

  let answer = Array(howMany).fill(0);

  answer.splice(0, arr.length, ...arr);

  return answer;
};

 

6-2. VSC에 작성한 내용

const solution = (arr) => {
  let howMany = 1;
  while (arr.length > howMany) {
    if (arr.length <= howMany) {
      break;
    }
    howMany *= 2;
  }

  let answer = Array(howMany).fill(0);

  answer.splice(0, arr.length, ...arr);

  return answer;
};

// 테스트
console.log(solution([1, 2, 3, 4, 5, 6])); // 6
console.log(solution([58, 172, 746, 89])); // 4
console.log(solution([1]));
console.log(solution([1, 2, 3]));


7. 특이사항

틀렸던 풀이

const solution = (arr) => {
  let howMany = 2;
  while (arr.length > howMany) {
    if (arr.length <= howMany) {
      break;
    }
    howMany *= 2;
  }

  let answer = Array(howMany).fill(0);

  answer.splice(0, arr.length, ...arr);

  return answer;
};

// 테스트
console.log(solution([1, 2, 3, 4, 5, 6])); // 6
console.log(solution([58, 172, 746, 89])); // 4
console.log(solution([1]));
console.log(solution([1, 2, 3]));

우선 풀이를, arr.length보다 큰 2의 제곱값을 howMany로 준비하여

let answer = Array(howMany).fill(0)으로 [0,0,0,0,.....0] 와 같은 빈 배열을 만들고,

answer의 인덱스 0부터 arr.length 까지를 arr과 바꾸는 식으로 하려하였다.

 

이에 따라 arr이 [1]과 같이 한자릿 수의 배열이라면

[1, 0]으로 만들어주도록

 

기본값 2인 howMany가 arr.length보다 작다면 2제곱을 해주고,

howMany가 arr.length보다 크거나 같다면 그대로 쓰려고 하였다

 

그런데 문제에서는 2의 0제곱, 즉 1도 조건으로 인정하고 있었다

따라서 한자릿수 배열이라면 이는 그대로 [1]으로 반환하면 되는거였다

 

이에따라 howMany의 기본값을 2에서 1로 수정하였고, 채점 통과하였다.

 

이건 좀 치사하지 않나

 


8. 다른 사람이 작성한 답

8-1. 가장 많이 쓰인 풀이법

function solution(arr) {
    let N = 1
    while (N < arr.length) N *= 2
    while (arr.length < N) arr.push(0)
    return arr
}

 

8-2. 좋아요를 가장 많이 받은 풀이법

function solution(arr) {
  const length = arr.length;
  const totalLength = 2 ** Math.ceil(Math.log2(length));
  return [...arr, ...new Array(totalLength - length).fill(0)];
}