문제
옵저버 패턴은 객체가 주체를 구독하고 무언가 일어날 때마다 알림을 받게 합니다. 여기서는 사람들이 토픽을 구독하고, 발행된 이벤트는 그 토픽의 모든 구독자에게 전달됩니다.
각 구독은 <person> <topic> 형식입니다. 같은 구독을 반복해도 효과가 더해지지 않습니다. 그다음 events의 각 이벤트는 토픽 이름이며, 그 토픽의 구독자는 각각 알림 1개를 받습니다. 아무도 구독하지 않은 토픽의 이벤트는 버려집니다.
event_subscribers(subscriptions, events)를 구현하세요.
입력
subscriptions: "<person> <topic>" 형식의 문자열(이름에는 공백이 없습니다).
events: 발행 순서대로의 토픽 이름.
출력
구독이 하나 이상 있는 사람마다 "<person>:<count>"를 이름순(문자 코드 순)으로 정렬해 반환합니다.
제약 조건
1 ≤ 구독 수 ≤ 10,000
0 ≤ 이벤트 수 ≤ 100,000
예시
입력:
events = ["news", "sports", "weather"]
subscriptions = ["bob sports", "alice news", "alice sports"]
예상 출력:
expected = ["alice:2", "bob:1"]
입력:
std::vector<std::string> events = {"news", "sports", "weather"};
std::vector<std::string> subscriptions = {"bob sports", "alice news", "alice sports"};
예상 출력:
std::vector<std::string> expected = {"alice:2", "bob:1"};
입력:
string[] events = new string[] {"news", "sports", "weather"};
string[] subscriptions = new string[] {"bob sports", "alice news", "alice sports"};
예상 출력:
string[] expected = new string[] {"alice:2", "bob:1"};
설명
alice는 news와 sports를 구독하므로 두 이벤트를 모두 받고, bob은 sports만 받으며, weather는 아무도 구독하지 않습니다: ["alice:2", "bob:1"].
입력:
events = []
subscriptions = ["zoe tech", "zoe tech"]
예상 출력:
expected = ["zoe:0"]
입력:
std::vector<std::string> events = {};
std::vector<std::string> subscriptions = {"zoe tech", "zoe tech"};
예상 출력:
std::vector<std::string> expected = {"zoe:0"};
입력:
string[] events = new string[] {};
string[] subscriptions = new string[] {"zoe tech", "zoe tech"};
예상 출력:
string[] expected = new string[] {"zoe:0"};
설명
중복 구독은 한 번만 세고, 발행된 이벤트가 없습니다: ["zoe:0"].
접근 방법
먼저 스스로 풀어 본 뒤 힌트를 하나씩 열어 보세요.
힌트 1
구독자를 토픽별로 묶으면 이벤트마다 받을 사람을 빨리 찾을 수 있습니다.
힌트 2
토픽마다 set을 쓰면 중복 구독은 한 번만 셉니다.
힌트 3
구독한 사람은 알림이 0개여도 결과에 포함됩니다.
예상 복잡도
시간 O(구독 수 + 이벤트 수 × 토픽당 구독자 수), 추가 공간 O(구독 수)
참고 자료
이 문제는 CodeUtility에 맞게 수정되었습니다. 위의 설명과 제한 조건을 따르세요.