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

문제 출처

Lv.1 K번째수 - JavaScript

문제 설명

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.
예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

  1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  3. 2에서 나온 배열의 3번째 숫자는 5입니다.

배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한 조건
  • array의 길이는 1 이상 100 이하입니다.
  • array의 각 원소는 1 이상 100 이하입니다.
  • commands의 길이는 1 이상 50 이하입니다.
  • commands의 각 원소는 길이가 3입니다.
예시

입출력 예

array commands return
[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]
풀이
function solution(array, commands) {
  return commands.map(
    (n) => array.slice(n[0] - 1, n[1]).sort((a, b) => a - b)[n[2] - 1]
  );

  // 풀이
  // 1. commands를 map() 메서드를 통해 한 배열 씩 반복해준다.
  //    n -> [2, 5, 3] -> n[0]: 2 / n[1]: 5 / n[2]: 3

  // 2. 들어온 n과 slice() 메서드를 통해 array 배열을 자른다
  //    [1, 5, 2, 6, 3, 7, 4] -> [5, 2, 6, 3]

  // 3. sort() 메서드를 통해 정렬해준다.
  //    [5, 2, 6, 3] -> [2, 3, 5, 6]

  // 4. 최종 정렬된 수에서 n[2] 번째 수를 map() 메서드에 반환한다.
  //    [n[2] - 1] 인덱스를 구해야 해서 1을 뺀다 -> 5
}

console.log(
  solution(
    [1, 5, 2, 6, 3, 7, 4],
    [
      [2, 5, 3],
      [4, 4, 1],
      [1, 7, 3],
    ]
  )
); // [5, 6, 3]
정리

오늘은 메서드 체이닝을 이용해서 간략하게 문제를 풀어봤습니다. 메소드 체이닝은 코드가 간결해 진다는 장점이 있는 반면 가독성이 그렇게 좋지는 못하다고 생각이 드네요.
쉬운 풀이 코드를 원하시면 댓글 남겨주세요!
사용된 메서드와 문법에 대해 더 공부하고 싶으신 분은 링크를 클릭해주세요!

map() 메서드 - MDN
slice() 메서드 - MDN
sort() - MDN

피드백은 언제나 환영입니다. 😊