99클럽 코테 스터디 13일차 TIL + LeetCode 1845. Seat Reservation Manager

2024. 6. 27. 02:44·TIL
반응형

 

 

 

오늘은 사무실에서 카카오톡 알림톡 기능을 구현 성공하고 기분이 너무 좋아서 가벼운 발걸음으로 왔다~!

그리고 노트북 열어서 알고리즘 공부 스타트🔥

 

 

오늘 문제는 읽으면서 코드짤 때 뭐야 이게 끝이야? 싶었지만 역시나 숨겨진 문제가 있었다.

 

 

 

일단 문제를 읽어보니

SeatManager로 n값에 따라서 앉을 수 있는 자리 initialize,

reserve() 메소드로는 자리를 예약했으르로 가장 숫자가 작은 자리를 pop,

unreserve() 메소드로는 주어진 seatNumber에 따라서 다시 이 자리를 반납하도록 구현하면 된다.

 

그래서 코드도 그냥 그대로 쉽게 구현했다.

 

class SeatManager:


    def __init__(self, n: int):
    	self.seat = []
    	for i in range(n):
    		self.seat.append(i+1)

    def reserve(self) -> int:
    	self.seat.sort()
    	n = self.seat.pop(0)
    	return n

    def unreserve(self, seatNumber: int) -> None:
    	self.seat.append(seatNumber)

 

 

그리고 제출하면...!!!!

 

 

띠로리... 이렇게 시간 초과가 발생한다.

도대체 뭐가 문제일까 고민해봤을때 시간복잡도에 걸릴만한건 sort() 뿐이였다.

 

흠... 뭘 써야 정렬하면서 추가 혹은 정렬하고 pop이 가능할까?

=> heap을 사용해보자

 

💡 python에서 heap을 사용하기 위해서는 import heapq 후 사용할 수 있다. 

- heap push
  heapq.heappush(arr, x) : x라는 값을 arr에 push 및 min heap으로 heapify까지 완료 => O(logN)

- heap pop
   heapq.heappop(arr) : arr에서 min 값 pop 및 min heap 으로 heapify까지 완료 => O(logN)

- heapify
   heapq.heapify(arr) : arr을 min heap으로 heapify 진행 => O(NlogN)

 

 

기존에 내가 짠 코드가 왜 시간 초과가 나는가에 대해서 생각해봤다.

 

시나리오1. sort() 후 pop() 하기

 

💡 python 에서 sort() 함수는 Timsort를 사용하며 O(NlogN)의 시간복잡도를 가진다.

sort() -> O(NlogN) + pop(0) -> O(N) 로 수행하면 O(NlogN)이 된다.
(pop(0)은 맨 앞의 값을 pop하고 한칸씩 움직이는 연산이 필요)

 

 

시나리오2. heappop() 사용하기

 

💡 python에서 heappop()의 경우 O(logN)의 시간복잡도를 가진다.

따라서 heappop()을 이용해서 pop과 동시에 바로 min heap을 생성하도록 하면 sort연산을 없앨 수 있다는 장점이 있다.
heappop()으로 추출하면 O(logN)

 

 

따라서 heap을 활용하여 다시 코드를 작성했다.

 

import heapq

class SeatManager:

    def __init__(self, n: int):
        self.seat = []
        for i in range(n):
            self.seat.append(i+1)

    def reserve(self) -> int:
        n = heapq.heappop(self.seat)
        return n

    def unreserve(self, seatNumber: int) -> None:
        heapq.heappush(self.seat,seatNumber)

 

이후 submit을 하면...!!!

 

 

시간초과 문제없이 잘 통과하는 것을 볼 수 있다!!

오늘도 하루 숙제 끄읕!!!!

 

반응형

'TIL' 카테고리의 다른 글

99클럽 코테 스터디 1일차 TIL + n^2 배열 자르기  (3) 2024.07.23
99클럽 코테 스터디 13일차 TIL + LeetCode 1338. Reduce Array Size to The Half  (0) 2024.06.27
99클럽 코테 스터디 12일차 TIL + 921. Minimum Add to Make Parentheses Valid  (0) 2024.06.25
99클럽 코테 스터디 11일차 TIL + LeetCode 2390. Removing Stars From a String  (0) 2024.06.24
99클럽 코테 스터디 10일차 TIL + LeetCode 341. Flatten Nested List Iterator  (0) 2024.06.24
'TIL' 카테고리의 다른 글
  • 99클럽 코테 스터디 1일차 TIL + n^2 배열 자르기
  • 99클럽 코테 스터디 13일차 TIL + LeetCode 1338. Reduce Array Size to The Half
  • 99클럽 코테 스터디 12일차 TIL + 921. Minimum Add to Make Parentheses Valid
  • 99클럽 코테 스터디 11일차 TIL + LeetCode 2390. Removing Stars From a String
Dangeunii
Dangeunii
    반응형
  • Dangeunii
    Dang'story
    Dangeunii
  • 전체
    오늘
    어제
    • 분류 전체보기 (67)
      • Front-end (0)
      • Back-end (8)
        • Spring (4)
      • 코딩테스트 (21)
        • C++ (8)
        • Python (13)
      • Computer Science (8)
        • 자료구조 & 알고리즘 (3)
        • 인공지능 (1)
        • 선형대수 (1)
        • 클라우드 (2)
        • 데이터베이스 (1)
      • TIL (29)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • hELLO· Designed By정상우.v4.10.3
Dangeunii
99클럽 코테 스터디 13일차 TIL + LeetCode 1845. Seat Reservation Manager
상단으로

티스토리툴바