공부 및 일상기록

[알고리즘] K번째 수 본문

개발/알고리즘, 자료구조

[알고리즘] K번째 수

낚시하고싶어요 2023. 4. 20. 14:51

문제

문제설명

  • 배열 array의 i번째 숫자부터 j번째 숫자까지 자르고, 정렬한 뒤, k번째 숫자를 구한다.
  • 예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면
  • array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  • 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  • 2에서 나온 배열의 3번째 숫자는 5입니다.
  • 이때 i,j,k를 원소로가진 2차원 배열이 commands로 주어졌을 때 commands의 모든 원소에 대한 각 숫자를 구하라

문제풀이

접근방식

일단 commands마다의 숫자를 구하는 것이므로 commands를 map함수로 돌려 각 원소에 대한 계산을 준비한다.

일단 배열의 slice메서드를 이용하면 손쉽게 잘라낸 숫자를 알 수 있다.

만약 array = [0,1,2,3,4,5]라면, array.slice(1,4)은 [1,2,3]이 된다.

slice(a,b)를 좀 더 쉽게 이해하려면 a번째 인덱스를 포함해서 b인덱스 직전까지의 숫자이다. (b인덱스의 숫자는 포함하지 않음)

그리고 sort를 이용해 정렬을 해준다. 그런데 프로그래머스 예시 코드에서 sort메서드의 compareFunction이 없으면 오류가 나므로 꼭 작성한다.

이렇게 구한 배열의 k번째 ( (k+1) 번 인덱스) 를 구한다.

실제 작성 코드

function solution(array, commands) {
  let answer = commands.map((command) => {
    return array.slice(command[0] - 1, command[1]).sort(function (a, b) {
      return a - b;
    })[command[2] - 1];
  });
  return answer;
}

이 문제는 복잡하지 않고, 어려운 메서드는 없으나, slice의 사용방법이 헷갈릴만한 문제였다.

또한 테스트 케이스에 sort함수에 compareFunction을 꼭 입력해야만 오류가 나지 않다는 것을 모르면 2번 케이스에서 오류가 나게 된다.