099. 이벤트 버스
Hard
바이브코딩
MCPEventPattern
문제 설명
[문제]
발행-구독(Pub-Sub) 방식의 이벤트 버스 MCP 서버를 구현한다. 이벤트 버스란 "누가 어떤 이벤트에 관심 있는지"를 등록해 두고(구독), 그 이벤트가 발생하면(발행) 관심 있는 모두에게 알림을 보내는 중개 장치다. 예를 들어 구독자 s1이 "e" 이벤트를 구독해 두면, 누군가 "e"를 발행할 때 s1이 알림을 받는다.
서버는 이벤트 이름 -> 구독자 ID 집합 매핑을 유지한다. 같은 구독자가 같은 이벤트를 여러 번 구독해도 한 번만 등록된다(집합이므로 중복 없음). 서버 시작 시 매핑은 비어 있다.
[구현할 함수]
- subscribe(event_name: str, subscriber_id: str) -> int
구독자를 해당 이벤트에 등록한다. 등록 후 그 이벤트의 구독자 수를 반환한다.
- publish(event_name: str, data: dict) -> int
이벤트를 발행하여 알림을 받은(=그 이벤트의 구독자) 수를 반환한다. 구독자가 없거나 존재하지 않는 이벤트면 0.
- unsubscribe(event_name: str, subscriber_id: str) -> bool
해당 구독을 취소한다. 실제로 구독 중이던 것을 취소했으면 True, 그런 구독이 없었으면 False.
- get_subscribers(event_name: str) -> 문자열 배열
해당 이벤트의 구독자 ID 배열을 반환한다. 없으면 빈 배열.
[입력·상태]
이벤트 이름·구독자 ID는 문자열, data는 임의의 키-값 객체(내용은 사용하지 않는다)다. 매핑은 호출 간에 유지된다.
[제약]
- 구독한 적 없는 (이벤트, 구독자)에 대한 unsubscribe는 False를 반환한다.
- 구독자가 없는 이벤트의 publish·get_subscribers는 각각 0·빈 배열을 반환한다.
[예시]
subscribe("e", "s1"), get_subscribers("e") -> ["s1"]
subscribe("e", "s1"), publish("e", {}) -> 1
subscribe("e", "s1"), unsubscribe("e", "s1") -> true
(빈 상태) publish("e", {}) -> 0
(빈 상태) unsubscribe("e", "s1") -> false
(빈 상태) get_subscribers("e") -> []
로그인하고 풀기
AI가 자동 채점하고 즉시 정답·해설을 알려줘요. 무료.