모든 챌린지
쉬움 0명 해결 정답률 0%

이벤트 구독자

옵저버 방식으로 각 토픽의 구독자에게 이벤트를 전달하고 각자 받은 알림 수를 셉니다.

배우게 될 내용

  • 토픽과 구독자를 연결하기
  • 이벤트의 모든 구독자에게 알리기
  • set으로 중복 구독 무시하기

문제

원문 보기 (영어)

옵저버 패턴은 객체가 주체를 구독하고 무언가 일어날 때마다 알림을 받게 합니다. 여기서는 사람들이 토픽을 구독하고, 발행된 이벤트는 그 토픽의 모든 구독자에게 전달됩니다.

각 구독은 <person> <topic> 형식입니다. 같은 구독을 반복해도 효과가 더해지지 않습니다. 그다음 events의 각 이벤트는 토픽 이름이며, 그 토픽의 구독자는 각각 알림 1개를 받습니다. 아무도 구독하지 않은 토픽의 이벤트는 버려집니다.

event_subscribers(subscriptions, events)를 구현하세요.

입력

subscriptions: "<person> <topic>" 형식의 문자열(이름에는 공백이 없습니다).

events: 발행 순서대로의 토픽 이름.

출력

구독이 하나 이상 있는 사람마다 "<person>:<count>"를 이름순(문자 코드 순)으로 정렬해 반환합니다.

제약 조건

1 ≤ 구독 수 ≤ 10,000

0 ≤ 이벤트 수 ≤ 100,000

예시

예시 1
입력:
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"].

예시 2
입력:
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에 맞게 수정되었습니다. 위의 설명과 제한 조건을 따르세요.

다른 사람의 풀이 보기

커뮤니티 솔루션

아직 공개된 풀이가 없습니다. 문제를 풀고 첫 풀이를 공유하세요.