프로그래머스 | K번째 수

chaen·2024년 2월 10일
post-thumbnail

📌 문제

배열 arrayi번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

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

제한사항

  • array의 길이는 1 이상 100 이하입니다.
  • array의 각 원소는 1 이상 100 이하입니다.
  • commands의 길이는 1 이상 50 이하입니다.
  • commands의 각 원소는 길이가 3입니다.

입출력 예

arraycommandsreturn
[1, 5, 2, 6, 3, 7, 4][[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입니다.

✨ 해결 방법

우선 commands가 2차원 배열이기 때문에 해당 배열의 0번째, 1번째, 2번째 요소를 추출해야 합니다.
그 후 for문과 push 혹은 slice를 통해서 해당하는 순서의 요소들만 잘라서 배열을 만든 후, sort를 이용하여 정렬하고, k 번째 요소만 answer에 넣어 결과값을 반환하면 됩니다.

💻 solution 1

function solution(array, commands) {
    const answer = [];
  
    for(a=0; a<commands.length; a++){
        const i = commands[a][0] - 1;
        const j = commands[a][1] - 1;
        const k = commands[a][2] - 1;

        const arr = [];
        for (b=i; b <= j; b++){
            arr.push(array[b]);        
        }
        arr.sort((x,y) => x-y);
        answer.push(arr[k]);
    }
    return answer;
}

for 문을 통해 commands의 각 요소를 추출하고, 다시 for문을 통해 해당하는 조건의 요소만 arrpush한 후, 정렬 후 arr에서 k 번째 요소를 반환하는 방법입니다.

배열은 0부터 시작하므로 1을 빼줘야 하며, 두번째 for문의 범위는 i부터 시작해서 j까지 돌도록 설정합니다.

위 풀이 방법은 직관적이지만 상당히 비효율적입니다.

💻 solution 2

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

풀이방법 1을 이와 같이 단축시킬 수 있습니다.
우선 map을 새로 생성하는데, 해당 map의 각 요소를 a로 받아 a의 0번째부터, a의 1번째 + 1만큼 slice로 자릅니다. (slice는 마지막 요소 앞까지 자르는데, 이번 경우에는 포함해야 하므로) 그것을 순서대로 정렬한 후, 그 전체 배열의 a[2]-1 번째 요소를 반환합니다.

0개의 댓글