한 이벤트 처리 시스템은 과도한 이벤트 발생으로 인해 처리 서버에 부하가 집중되는 것을 방지하기 위해 Rate Limiter를 사용한다.
각 이벤트는 발생 시각(timestamp)과 이벤트 소스(sourceId)를 가진다.
규칙은 다음과 같다.
- 동일한 sourceId에서 발생한 이벤트는 마지막으로 처리된 시각으로부터 K초 이상 경과해야 처리된다.
- K초가 지나지 않은 경우 해당 이벤트는 무시된다.
- 서로 다른 sourceId는 독립적으로 관리된다.
- 이벤트는 발생 시각 순서대로 입력된다.
주어진 이벤트 목록에 대해 실제로 처리되는 이벤트 개수를 구하시오.
예를 들어 K = 10 일 때
1 UserA
5 UserA
12 UserA
20 UserA
라면
1 UserA -> 처리
5 UserA -> 무시
12 UserA -> 처리
20 UserA -> 무시
가 된다.
첫 번째 이벤트가 처리된 이후,
같은 sourceId의 다음 이벤트는 마지막 처리 시각으로부터 K초 이상 경과해야 다시 처리될 수 있다.
첫째 줄에 이벤트 수 N과 제한 시간 K가 주어진다.
N K
다음 N개의 줄에는 이벤트 정보가 주어진다.
timestamp sourceId
- 1 ≤ N ≤ 300000
- 1 ≤ K ≤ 10^9
- 0 ≤ timestamp ≤ 10^9
- sourceId 길이 : 1 ~ 30
- sourceId는 영문 대소문자, 숫자로 구성
- 입력은 timestamp 오름차순으로 주어진다.
실제로 처리되는 이벤트 개수를 출력한다.
10 10
1 UserA
5 UserA
8 UserB
12 UserA
18 UserB
21 UserA
25 UserA
30 UserC
35 UserB
40 UserA
7
이벤트 처리 결과는 다음과 같다.
1 UserA -> 처리
5 UserA -> 무시
8 UserB -> 처리
12 UserA -> 처리
18 UserB -> 처리
21 UserA -> 무시
25 UserA -> 처리
30 UserC -> 처리
35 UserB -> 처리
40 UserA -> 처리
실제로 처리된 이벤트는 총 7개이다.
이 문제는 해시(Hash), 자료구조(Data Structure), 시뮬레이션(Simulation) 문제이다.
import sys
input = sys.stdin.readline
n, k = map(int, input().split())
last_processed = {}
processed_count = 0
for _ in range(n):
timestamp, source_id = input().split()
timestamp = int(timestamp)
if source_id not in last_processed:
processed_count += 1
last_processed[source_id] = timestamp
elif timestamp - last_processed[source_id] >= k:
processed_count += 1
last_processed[source_id] = timestamp
print(processed_count)