K번째수 Kth number

💡
Level 1 210920
과거 내 풀이
function solution(array, commands) {
    var answer = [];
    for(let i=0; i<commands.length; i++){
        const arr = array.slice(commands[i][0]-1, commands[i][1]).sort((a,b)=>a-b)
        
        answer.push(arr[commands[i][2]-1]);
    }
    return answer;
}
 

문제 설명

배열 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]입니다.
  1. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  1. 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
[[2, 5, 3], [4, 4, 1], [1, 7, 3]]
[5, 6, 3]

입출력 예 설명

[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.
 

My solution


array는 commands의 길이만큼 반복하면서 연산을 수행해야 한다. commands의 원소의 개수만큼 결과값이 필요하기 때문이다.

for문이 첫 번째로 실행되었을 때 commands는 [2,5,3]을 넘겨줄 것이다.
여기서 i = 2, j = 5를 가지고 array.slice(i-1, j)로 실행하면 원하는 배열이 반환된다.
이를 sort()메서드를 이용해 정렬한다.
이후 정렬된 배열을 filter 메서드로 조건에 맞는(k번째) 원소만을 뽑아 배열로 반환한 다음,
배열을 스프레드 연산자로 원소를 뽑아 answer에 push하는 것을 반복했다.
function solution(array, commands) {
    let answer = [];
    for (let s = 0; s < commands.length; s++) {
        let [i, j, k] = commands[s];
        // 2, 5는 인덱스 기준 1,4이지만 slice 메서드의 두번째 인자는 +1한 값이어야 함
        answer.push(
            ...array
                .slice(i - 1, j)
                .sort((a, b) => a - b)
                .filter((v, i) => i === k - 1)
        );
    }
    return answer;
}

test("solution", () => {
    expect(
        solution(
            [1, 5, 2, 6, 3, 7, 4],
            [
                [2, 5, 3],
                [4, 4, 1],
                [1, 7, 3],
            ]
        )
    ).toStrictEqual([5, 6, 3]);
});