문제

구름이는 구름 사이트의 UXUI디자이너로 일하게 되었다. 구름이의 첫 업무는 구름 사이트에서 사용자들이 자주 실행하는 이벤트를 정리하는 일이다. 이때 이벤트란 사용자가 웹사이트에서 실행하거나, 클릭한 것을 의미한다.

 

구름이는 이를 위해서 사용자들이 취할 수 있는 이벤트를 N개로 규정하고, 각각의 이벤트에 1번부터 N

번까지 번호를 붙였다.

 

구름이는 이어서 M명의 사용자가 구름 사이트에서 이벤트를 실행한 내역을 추출하였다. 추출한 정보를 바탕으로 구름이는 사용자들이 가장 자주 실행하는 이벤트들을 알아내고자 한다. 한 사람이 같은 이벤트를 여러 번 실행한 경우에도 중복으로 세어준다.

 

구름이를 도와 M명의 사용자들이 가장 자주 실행했던 이벤트들을 찾아 출력하시오. 


입력

첫째 줄에 구름이가 정리한 이벤트의 개수 N(1 <= N <= 100,000)과 사용자의 수 M(1 <= M <= 1,000)이 공백을 두고 주어진다.
둘째 줄부터 M
개의 줄에 걸쳐서 사용자가 구름 사이트에 접속하여 실행한 이벤트의 정보가 아래와 같이 주어진다.

  • 한 줄에는 한 명의 사용자의 정보를 담고 있다.
  • i+1 번째 줄의 첫 번째 정수 k(1 <= k <= 100)는 i번 사용자가 실행한 이벤트의 개수이다.
  • 이후 같은 줄에 k개의 정수가 공백을 두고 주어진다. 각 정수는 i번 사용자가 실행한 이벤트의 번호를 의미한다.
  • 이벤트의 번호는 모두 1 이상 N이하의 정수이다.

먼저, N+1 크기의 eventCount배열을 생성한다.

이후, M명의 사용자에 대해 각각 사용자가 실행한 k개의 이벤트 번호(=event)를 입력 받고 eventCountd배열에 event를 인덱스로하여 해당 인덱스를 증가시켜 주었다.

즉, 사용자가 4번 이벤트를 실행했다면 eventCount[4]를 증가시켜 주는 것이다.

모든 입력에 대해 위 과정을 수행했다면 *max_elment함수를 사용하여 가장 많이 실행된 횟수(=maxCnt)를 찾아내고

최종적으로 eventCount를 뒤에서부터(가장 많이 실행한 이벤트가 여러 개라면 번호가 큰 순서부터 출력해야 하므로) 탐색하며 maxCnt인 인덱스를 출력하는 것이다.

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n, m, k, event;

int main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> n >> m;
	vector<int> eventCount(n+1, 0);

	for (int i = 0; i < m; i++) {
		cin >> k;
		for (int j = 0; j < k; j++) {
			cin >> event;
			eventCount[event]++;
		}
	}
	int maxCnt = *max_element(eventCount.begin(), eventCount.end());
	for (int i = n; i >= 1; i--) if (eventCount[i] == maxCnt) cout << i << " ";
	return 0;
}