t
: 요청 시간 ()
특정 시간 내 최신 요청의 수를 세는 RecentCounter
클래스가 있다.
RecentCounter
클래스는
ping
함수 존재t
에서의 요청을 추가[t - 3000, t]
범위의 요청의 수 반환이때, ping
의 모든 call은 이전 call보다 더 큰 시간 t라는 것을 보장한다.
→ call은 시간 순서대로 들어온다!
이 문제는 RecentCounter
클래스를 조건에 따라 구현하는 문제이다.
__init__()
함수엔 요청 시간을 저장할 공간을 정의하도록 구현하고,
ping()
함수엔 입력된 요청을 추가하고 최신 요청 시간으로부터 3000ms 사이의 요청만 저장하여 그 요청을 저장한 리스트의 길이를 반환하도록 구현하면 된다.
while →
최종 시간복잡도
최악의 경우에도 로 상수 시간이므로 충분히 동작할 수 있다.
from collections import deque
class RecentCounter:
def __init__(self):
# 요청 시간 저장할 큐 정의
self.pings = deque()
def ping(self, t: int) -> int:
# 요청 시간 저장
self.pings.append(t)
# 3000ms외의 요청 제거
while self.pings and self.pings[0] < t - 3000:
self.pings.popleft()
# 요청 개수 반환
return len(self.pings)
# Your RecentCounter object will be instantiated and called as such:
# obj = RecentCounter()
# param_1 = obj.ping(t)
from bisect import bisect_left
class RecentCounter:
def __init__(self):
# 요청 시간 저장 리스트(오름차순)
self.pings = []
def ping(self, t: int) -> int:
# 새 요청 추가
self.pings.append(t)
# 최근 3000m초의 시작 시간 계산
tStart = t - 3000
# 3000ms초 내에 있는 첫번째 요청 인덱스 찾기
tStartPos = bisect_left(self.pings, tStart)
# 3000ms초 내의 요청 개수 반환
return len(self.pings)-tStartPos
# Your RecentCounter object will be instantiated and called as such:
# obj = RecentCounter()
# param_1 = obj.ping(t)
bisect_left
함수는 시간복잡도가 로 효율적인 방법이라 할 수 있다.