ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스-42748] K번째 수: 파이썬, 자바스크립트 풀이
    알고리즘/문제풀이 2025. 8. 31. 21:38

    문제


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

     

     

    해결 아이디어

    이 문제의 경우 구체적인 정렬 알고리즘을 구현하는 것은 아니고 파이썬/자바스크립트의 내장 정렬 함수를 그대로 사용하는 것이다. 파이썬과 자바스크립트에서의 정렬 함수는 다음과 같다.

    언어 함수 반환 내부 알고리즘 특징
    Python sorted() 새 리스트 TimSort( Merge Sort + Insertion Sort) 리스트, 튜플, 문자열 등 어떤 iterable이든지 다 가능
    Python list.sort() None TimSort( Merge Sort + Insertion Sort) 리스트만
    JavaScript Array.sort() 원본 배열 (in-place) Timsort/InsertionSort/MergeSort (엔진별) compareFn 없으면 문자열 기준
    따라서 숫자 정렬을 하고 싶을 땐
    1. 오름차순: Array.sort((a,b)=>a-b)
    2., 내림차순: Array.sort((a,b)=>b-a)

    정답 코드<Python>

    1. 내가 푼 풀이

    def solution(array, commands):
        answer = []
        for i in range (len(commands)):
            sliced_array = sorted(array[int(commands[i][0])-1:commands[i][1]])
            answer.append(sliced_array[int(commands[i][2])-1])
        return answer

     

    내가 푼 코드이다. 슬라이싱한 배열을 sorted()로 정렬하고, k번째의 원소를 answer리스트에 넣는 것을 반복한다.sorted()는 원본을 변경하지 않고 새로운 리스트를 반환한다.

     

    2. 다른 분 풀이

    def solution(array, commands):
        return list(map(lambda x:sorted(array[x[0]-1:x[1]])[x[2]-1], commands))

     

    이 풀이는 파이썬의 람다+map을 이용하여 아주 간결하게 적은 코드이다. 슬라이싱 -> 정렬 -> 인덱싱이라는 핵심 아이디어는 동일하다.

     

    정답 코드<JavaScript>

    1. 내가 푼 풀이

    function solution(array, commands) {
        var answer = [];
        for (let i = 0; i < commands.length ;i++){
            const sliced_array = array.slice(commands[i][0]-1, commands[i][1]);
            sliced_array.sort((a,b)=> a-b);
            answer.push(sliced_array[commands[i][2]-1]);
        }
    
        return answer;
    }

     

    앞서 풀었던 파이썬 풀이를 자바스크립트로 구현한 것이다. 파이썬과 다르게 slice(i,j)를 사용하여 배열의 i번째 원소부터 j-1번째 원소까지로 슬라이싱을 하고, sort()를 통해 오름차순으로 구현하였다. 숫자 정렬시 반드시 sort((a,b) => a-b)를 넣어야된다.

     

    2. 다른 분 풀이

    function solution(array,commands){
      return commands.map(command => {
        const [sPosition, ePosition, position] = command
        const newArray = array.filter((value,fIndex) => fIndex >= sPosition - 1 && fIndex <= ePosition - 1).sort((a,b)=>a-b)
        return newArray[position-1]
      })
    }

    자바스크립트의 구조분해할당을 이용하여 각각 의미 있는 변수에 담았다.

    slice()를 이용하여 배열을 자를 수도있지만, filter()을 사용하여 조건에 맞는 인덱스만 남겨 새 배열을 만들었다.

Designed by Tistory.