문제 링크
https://programmers.co.kr/learn/courses/30/lessons/42748?language=python3
문제 설명
배열 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 함수를 작성해주세요.
제한 사항
1. array의 길이는 1 이상 100 이하입니다.
2. array의 각 원소는 1 이상 100 이하입니다.
3. commands의 길이는 1 이상 50 이하입니다.
4. commands의 각 원소는 길이가 3입니다.
입출력 예시
2차원 리스트인 commands에서 한 묶음씩 원소들을 꺼내와서 array 리스트의 슬라이싱으로 사용합니다.
실제 리스트의 인덱스는 0임을 인지하고, 이를 바탕으로 인덱스를 다루게 되면
첫 번째 원소는 -1을 해야 시작 인덱스로 활용할 수 있고,
두 번째 원소는 마지막 인덱스로 바로 사용 가능,
세 번째 원소는 -1을 해야 원하는 인덱스로 활용할 수 있다.
def solution(array, commands): answer = [] for idx in range(len(commands)): i = commands[idx][0] j = commands[idx][1] k = commands[idx][2] sliced = array[i-1:j] sliced.sort() answer.append(sliced[k-1]) return answer |
for idx in range(len(commands)): i = commands[idx][0] j = commands[idx][1] k = commands[idx][2] -> 2차원 리스트에서 1개의 묶음을 가져와 계산에 활용 |
sliced = array[i-1:j] sliced.sort() -> 문제에서 요구하는 리스트 슬라이싱을 진행하고, 정렬 |
answer.append(sliced[k-1]) -> 결과 리스트에서 원소를 추출 후, 정답 리스트에 저장 |
문제를 해결하면 다른 분들의 해답도 볼 수 있습니다.
1줄로 완성하신 분의 코드는 파이썬 문법으로 배울 게 정말 많아서 공부할 겸 작성했습니다.
코드가 1줄이기 때문에 매우 간결하지만, 그 안에 포함된 구조는 어렵게 다가올 수 있습니다.
그래서 하나씩 분해했습니다.
sorted(array[x[0]-1 : x[1]])
sorted()는 정렬해주는 함수입니다. array[x[0]-1 : x[1]]의 슬라이싱 부분을 정렬하겠다는 의미입니다.
그럼 여기서 x는 어떤 값일까요?
lambda x: sorted(array[x[0]-1 : x[1]])[x[2]-1]
좀 더 확장해서 lambda 범위까지 포함했습니다. lambda는 효율적인 함수 표현을 가능하게 해 줍니다.
x는 lambda의 인자이며 콜론(:)을 기준으로 우측은 x를 활용한 표현식이 되는 것입니다.
하지만, 이 과정에서까지 x가 정확히 어디서 가져온 값인지 확인할 수 없습니다.
map(lambda x:sorted(array[x[0]-1 :x[1]])[x[2]-1], commands)
map() 함수까지 확장하면 x의 출처를 확인할 수 있습니다.
map() 함수는 (적용 함수, iterable 객체)의 매개변수를 받습니다.
map의 역할은 iterable 객체를 적용 함수에 사용할 수 있도록 합니다.
계산 결과로 나타나는 값은 튜플(tuple) 형태로 반환합니다.
여기서 x는 commands의 원소를 가져와 활용한다는 것을 알 수 있습니다.
x[0]-1 = 작성한 코드의 i-1
x[1] = 코드의 j
x[2]-1 = 코드의 k-1
array[x[0]-1:x[1]] = array[i-1: j]
sorted(array[x[0]-1:x[1]])[x[2]-1]
=
sliced = array[i-1:j]
sliced.sort()
map() 함수에 의해서 최종적으로 반환되는 결과는 튜플이기 때문에
문제에서 표현되는 리스트로 변환하기 위해 마지막에 list() 함수를 사용하는 것입니다.
많이 배우고 갑니다...!
- 끝 -
'작업 > Problem Solving' 카테고리의 다른 글
프로그래머스 위클리 챌린지 (2주차) - Python3 (0) | 2021.08.14 |
---|---|
백준 1094(막대기) 파이썬(python3) 해결 (0) | 2021.08.09 |
프로그래머스 코딩 테스트 (완주하지 못한 선수) - Python3 (0) | 2021.08.01 |
프로그래머스 코딩 테스트 (모의고사) - Python3 (0) | 2021.07.31 |
프로그래머스 코딩 테스트 연습 (로또의 최고 순위와 최저 순위) - Python3 (0) | 2021.07.31 |