2024년 2월 18일 일요일

215. Kth Largest Element in an Array

문제 링크: https://leetcode.com/problems/kth-largest-element-in-an-array/description/

파이썬 소스: https://bit.ly/3w4bI5j

 계속 heapq를 사용해서 풀 수 있는 문제가 나오네요.

k개수 만큼 큰 수를 heap에 저장하구요, heappush() heappushpop()에서 작은 숫자는 heap에서

빠지게 됩니다. heapq를 사용하면 쉽게 풀 수 있는 문제입니다.


from typing import List
import heapq

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        heap = []

        for num in nums:
            if len(heap) == k:
                heapq.heappushpop(heap, num)
            else:
                heapq.heappush(heap, num)

        return heap[0]


2024년 2월 4일 일요일

leetcode.com 973. K Closest Points to Origin

문제 링크: https://leetcode.com/problems/k-closest-points-to-origin/description/

파이썬 소스: https://bit.ly/49icv0X


이번 문제도 heapq를 사용해서 풀 수 있습니다.



from typing import List
import heapq

class Solution:
    def kClosest(self, points: List[List[int]], k: int) -> List[List[int]]:
        heap = []

        for x, y in points:
            distance = x*x + y*y

            if len(heap) == k:
                heapq.heappushpop(heap, (-distance, x, y))
            else:
                heapq.heappush(heap, (-distance, x, y))

        return [[x, y] for dist, x, y in heap]

leetcode.com 1046. Last Stone Weight

문제 링크: https://leetcode.com/problems/last-stone-weight/description/

파이썬 소스: https://bit.ly/3I5IUwl

 

heapq 와 PriorityQueue를 중 1가지를 사용해서 풀 수 있는 문제입니다.

속도 면에서는 heapq가 더 빠르겠지만, leetcode.com 703. Kth Largest Element in a Stream

문제를 풀 때, heapq를 사용해봤기 때문에, 이번문제 에서는 PriorityQueue 를 사용하겠습니다.


더 큰 값이 앞으로 오도록 하기 위해서 (self.max - stone, stone) 이렇게 튜플을

사용한 부분이 문제를 PriorityQueue를 사용해서 풀기위해 중요한 부분입니다.


from typing import List
from queue import PriorityQueue

class Solution:
    def __init__(self):
        self.max = 1000

    def lastStoneWeight(self, stones: List[int]) -> int:
        pq = PriorityQueue()

        for stone in stones:
            pq.put((self.max - stone, stone))

        while pq.qsize() > 1:
            y = pq.get()[1]
            x = pq.get()[1]

            if x == y:
                continue
            elif x != y:
                n = y - x
                pq.put((self.max - n, n))

        if pq.qsize() >= 1:
            return pq.get()[1]

        return 0

2024년 2월 3일 토요일

leetcode.com 703. Kth Largest Element in a Stream

 문제 링크: https://leetcode.com/problems/kth-largest-element-in-a-stream/description/


from typing import List

class KthLargest:
    def __init__(self, k: int, nums: List[int]):
        self.k = k
        self.nums = sorted(nums)

    def add(self, val: int) -> int:
        if len(self.nums) == 0:
            self.nums.append(val)
        elif len(self.nums) > 0   \
            and self.nums[len(self.nums) -1] <= val:
            self.nums.append(val)
        else:
            for idx in range(len(self.nums)):
                if val < self.nums[idx]:
                    self.nums.insert(idx, val)
                    break

        return self.nums[len(self.nums) - self.k]

위와 같이 배열의 처음 부터 비교해서, self.nums가 정렬된 상태를 유지한 채로,

val을 오름 차순으로 정렬했을 때, val이 들어갈 위치에, insert() 메서드를 사용해서

집어 넣는 방식으로 구현해도 이 문제의 정답 판정을 받을 수 있습니다.

하지만, 좀... 속도변에서 다른 풀이 보다 느립니다.


그러면 속도를 좀 빠르게 할 방법을 생각해보면, nums의 길이를 줄이는 방법 밖에 없습니다.

문제에서 요구한 것은 뒤에서 부터 k번째 값을 리턴하는 것입니다.

즉 0 ~ (len(nums) -k -1) 인덱스에 있는 값들은 필요하지 않습니다.

따라서, 꼭 가지고 있어야 하는 값은 k 개 입니다.


아래와 같이 heapq를 사용해서, 필요한 가장큰 3개의  값만 남기고

나머지는 모두 제거 하는 방식으로 구현할 수 있습니다.

따라서, add() 가 호출 될 때, 가지고 있는 nums의 길이도 최대 k 로 유지되어서,

실행속도도 빠르게 구현할 수 있습니다.


import heapq
from typing import List

class KthLargest:
    def __init__(self, k: int, nums: List[int]):
        self.k = k
        self.nums = nums
        heapq.heapify(self.nums)

        while len(self.nums) > self.k:
            heapq.heappop(self.nums)

    def add(self, val: int) -> int:
        heapq.heappush(self.nums, val)

        while len(self.nums) > self.k:
            heapq.heappop(self.nums)

        return self.nums[0]

# Your KthLargest object will be instantiated and called as such:
# obj = KthLargest(k, nums)
# param_1 = obj.add(val)

2022 KAKAO BLIND RECRUITMENT 사라지는 발판

 


문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/92345
파이썬 소스: http://bit.ly/3GkaLse

2022 KAKAO BLIND RECRUITMENT 파괴되지 않은 건물

 


문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/92344
파이썬소스: http://bit.ly/3Gikm2M

2022 KAKAO BLIND RECRUITMENT 양과 늑대


 

문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/92343

파이썬소스: http://bit.ly/3vK7IDz

2022 KAKAO BLIND RECRUITMENT k진수에서 소수 개수 구하기


 

문제 링크: https://bit.ly/3jsiNa9

파이썬소스: http://bit.ly/3JI1Frq

2022 KAKAO BLIND RECRUITMENT 신고 결과 받기

 

 
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/92334
파이썬소스: http://bit.ly/3GbA1jc