-
[프로그래머스-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()을 사용하여 조건에 맞는 인덱스만 남겨 새 배열을 만들었다.
'알고리즘 > 문제풀이' 카테고리의 다른 글
[프로그래머스 -42746] 가장 큰 수: 파이썬, 자바스크립트 풀이 (0) 2025.09.02 [프로그래머스-1844]게임 맵 최단거리: 파이썬, 자바스크립트 풀이 (4) 2025.08.27 [프로그래머스-43162] 네트워크: 파이썬, 자바스크립트 풀이 (1) 2025.08.27 [프로그래머스-43165] 타겟 넘버: 파이썬, 자바스크립트 풀이 (3) 2025.08.02 [프로그래머스-87946] 피로도 - 파이썬, 자바스크립트 (3) 2025.07.27