LeetCode [ 215 | Python ] Kth Largest Element in an Array
업데이트:
문제
주어진 배열 nums
에서 또한 주어진 정수 k
번 째로 큰 정수를 반환해야하는 문제.
풀이
지속적으로 한다면 가장 큰 값을 찾는 것도, 가장 작은 값을 찾는 것도 heap이 유리하다.
이는 pop 연산을 수행하면 가장 작은 값을 반환하는 heap의 특성 때문인데, 가장 큰 값을 찾기 위해서는 단순히 저장할 때 -
를 취한 값을 저장해주면 된다.
이를 이용해 문제를 해결하고자 했다.
정답
실행시간 : 909ms
메모리 : 23.8MB
nums
의 모든 원소에-
를 취해heap
에 저장한다.k-1
만큼heappop
연산을 수행한다.k-1
인 이유는 return 값을k
번째 값을 마지막으로pop
하기 위함이다.
pop
연산을 수행한 값에-
을 취해 반환한다.
값을 하나씩 넣은 뒤 다시 빼는 것은 다소 비효율적인 코드로 보였다.
또한 더욱 유용한 함수를 알고 있었기 때문에, 이를 활용하기로 했다.
import heapq
class Solution(object):
def findKthLargest(self, nums, k):
heap = []
for n in nums:
heapq.heappush(heap, -n)
for _ in range(k-1):
heapq.heappop(heap)
return -heapq.heappop(heap)
nlargest 활용 (개선 ?)
실행시간 : 740ms
메모리 : 28.5MB
파이썬은 nlargest
라는 n
개의 큰 값을 찾아내는 함수가 존재한다.
이는 heapq
자료구조에 대해 수행되어야 하기 때문에 입력받은 nums
를 heapify
연산을 통해 힙 구조로 만들고 그에 대해 nlargest
함수를 적용하면 된다.
하지만 최대값들을 담을 새로운 배열을 생성하기 때문에 그만큼 많은 메모리를 사용하는 모습을 볼 수 있다.
import heapq
class Solution(object):
def findKthLargest(self, nums, k):
heapq.heapify(nums)
return heapq.nlargest(k,nums)[-1]
생각 & 정리
지속적으로 큰 값을 얻어내야한다는데 어려움이 있을 수 있었으나 힙, 우선순위 큐에 대해 알고있음으로 다소 쉽게 해결할 수 있는 문제였다.
이렇듯 다양한 문제를 해결하는데 자료구조가 활용된다.
어떻게 저장하고, 어떻게 빼내고 또한 어떻게 관계를 맺어주는가에 대해 설정해주는 것 뿐으로 복잡해질 수 있는 연산을 간단하게 해결가능한 것이다.
학교 수업에서도, 따로 구현도 해보는 시간을 가졌지만 더 다양한 자료구조에 대해 알아보고 싶다는 생각이 들었다.
댓글남기기