-
[프로그래머스 Level 1] K번째 수(map, sort, sorted)알고리즘 문제풀이/Python 2020. 2. 6. 12:38
문제
배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.
예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면
- array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
- 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
- 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
[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의 요소를 하나씩 선택하여, array에 규칙을 적용하자.
def solution(array, commands): answer = [] def cut(v): arr = sorted(array[v[0] - 1: v[1]],reverse=False) return arr[v[2] - 1] answer = list(map(cut, commands)) return answer
commands의 요소를 하나씩 선택하는 방법은 다양하다. for문을 사용하는 방법이 가장 무난하지만, 이번에는 map을 활용해서 map에 대한 이해력을 높이는 방향으로 문제를 풀었다.
JavaScript와 달리 Python의 map은 (function, iterable)의 구조를 띈다. 문제에서 나는 function을 미리 정의하고, 이를 활용하는 방식으로 문제를 해결했지만, lambda를 이용해서도 문제를 풀 수 있다. 아래는 lambda를 활용한 풀이이다.
def solution(array,commands): return list(map(lambda v: sorted(v[0] - 1 : v[1])[v[2] - 1], commands))
이 문제에서 또 하나 정리할 점은 sorted이다. Python에서 정렬에 사용하는 내장 함수는 [].sort()와 sorted(iterable)이다.
이 둘의 특징에 대해 간단히 정리하면 다음과 같다.
sort() 함수
- list에만 사용가능
- 기본 정렬이 내림차순 정렬
- none을 반환
sorted() 함수
- 모든 iterable 객체에 사용 가능
- 기본 정렬이 오름차순 정렬
- 정렬된 list를 반환
느낀 점
- map의 사용을 익힐 수 있었고, map에는 익명함수인 lambda를 사용하는 게 메모리 상 효율적이라는 걸 배울 수 있었다.
- sort()와 sorted()의 차이를 정리할 수 있었다.
'알고리즘 문제풀이 > Python' 카테고리의 다른 글
비트연산자와 비트마스크 (0) 2020.02.09 [구름에듀] 환상의 조합 (0) 2020.02.08