[프로그래머스] K번째 수 (JavaScript)

알고리즘 문제풀이 [프로그래머스] K번째 수 (JavaScript)

image

프로그래머스 Level 1 - K번째수

문제

image

commands 배열은 [i, j, k] 형태의 원소를 가지는 2차원 배열이다. 1차원 배열 array에 대해 commands의 모든 각각의 원소를 적용해야 한다.

  1. array의 i번째부터 j번째까지 자른다.
  2. 1번에서 나온 배열을 정렬한다.
  3. 2번에서 나온 (정렬된) 배열에서 k번째 숫자를 찾는다.
  4. 이렇게 commands를 돌며 3번에서 나온 숫자들을 배열에 담아 최종적으로 리턴한다.

풀이1

  • commands 배열을 forEach로 순회하며 아래 과정을 반복한다.
  • slice() 함수를 이용해 array를 자른다.
  • 잘린 배열(slicing)을 sort()로 정렬한다.
  • 잘린 배열(slicing)에서 k번째 수를 찾아 정답 배열(answer)에 넣는다.

🏷️ Syntax

  • Array.prototype.sort()
    • 그냥 sort()는 배열의 요소들을 아스키 코드 순서대로 정렬한다.([100, 1, 4, 13,10][1, 10, 100, 13,4] 으로 정렬한다. -> 원하는 결과X) sort(function(a, b){ return a - b; }); 와 같이 작성해야 숫자를 오름차순으로 정렬할 수 있다.
    • 참고: 자바스크립트 정렬 함수, sort()
  • 구조 분해 할당(Destructuring Assignment)

풀이1 코드

function solution(array, commands) {
  let answer = [];
  commands.forEach((command) => {
    const slicing = array.slice(command[0] - 1, command[1]); // array의 i ~ j번째까지 잘라 새로운 배열에 저장
    slicing.sort((a, b) => a - b); // 정렬
    answer.push(slicing[command[2] - 1]);
  });
  return answer;
}
  • 시간 복잡도: O(n^2) 보다 클 것으로 예상
    • 반복문 안에서 sort() 실행하므로

💡 sort()의 시간 복잡도

  • 자바스크립트의 sort() 메서드가 호출될 때 어떤 정렬 알고리즘을 사용하는지는 JS엔진에 따라 달라질 수 있다고 한다.
  • Chrome, Firefox의 경우 sort()O(n log n)의 시간복잡도를 갖는다고 한다.

image

풀이2

풀이1의 코드를 간단하게 바꿨다.

풀이2 코드

function solution(array, commands) {
  return commands.map(
    ([i, j, k]) => array.slice(i - 1, j).sort((a, b) => a - b)[k - 1]
  );
}
  • 시간 복잡도: 풀이1과 동일. O(n^2)보다 클 것으로 예상

풀이3

  • 정렬 알고리즘 중에서 버블 정렬을 사용해 문제를 풀었다.
  • 버블 정렬 개선: 이미 정렬되어 있는 배열의 경우 반복문을 빨리 벗어날 수 있도록 코드를 작성했다.(exchg 변수 관련)

풀이3 코드

function bubbleSort(arr) {
  for (let i = 1; i < arr.length; i++) {
    let exchg = 0;
    for (let j = 0; j < arr.length - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        const temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
        exchg++;
      }
    }
    if (!exchg) break;
  }

  return arr;
}

function solution(array, commands) {
  let answer = [];
  answer = commands.map(([i, j, k]) => {
    const slicing = bubbleSort(array.slice(i - 1, j));
    return slicing[k - 1];
  });
  return answer;
}
  • 시간 복잡도: O(n^3)
    • map 반복 안에서 이중 for문이 실행되므로

image

  • 이 풀이의 경우 sort()를 사용했을 때보다 시간이 좀 더 걸리는 것을 알 수 있다.

References