Coding test

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

Jiwoo 2022. 4. 19. 15:44

문제

배열 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입니다.
       

나의 풀이

function solution(arr, commands) {
    // 2차원 command = [[i, j, k], ... ]
    // arr를 j~j까지 자르고 -> 정렬 -> k번째 반환 = [k, k, k...]

    // arr에 [i, j, k] 적용하는 식
    // arr.slice(i-1,j+1).sort((a,b) => a-b)[k-1]

    // 위 식을 배열로 묶기
    return commands.map(e => arr.slice(e[0]-1,e[1]).sort((a,b) => a-b)[e[2]-1]);

}

 
이런 문제는 쉽지만 헷갈릴 수 있기 때문에, commands의 각 값을 적용한 수부터
이를 배열로 감싸주는 식까지 순서대로 주석을 작성하며 풀었다.
개인적으로 만족스러운 풀이.
 

  • 정확도 테스트 결과


     


그나저나 프로그래머스는 다른 사람들의 풀이를 볼 수 있지만
좋아요 수 순서대로 정렬되기 때문에 뚜렷한 기준 없이 상위가 결정된다.
창의적이거나 간결하지만, 가독성이 극악인 답들이 있는데
모던 js 튜토리얼에서 그렇게는 절대 작성하지 말라는 글을 봐서(ㅋㅋ) 따라하지 않으려고 한다.
 

대체 모범적인 답은 뭘까?
가독성, 속도, 효율성 등 기준은 각자마다 다르겠지만 말이다.
나는 일단 최대한 for문 중첩을 사용하지 않고 js의 메서드를 사용해서 풀어보고 있고
다른 풀이들도 보면서 속도를 측정하고, 가장 간결하면서 빠른 풀이를 모범답안으로 보고 있다.