https://www.acmicpc.net/problem/3018
복잡했다...
워크 플로우를 적는 느낌이었다.
시간 복잡도는 터지지 않는다 싶어 구현으로 풀었다.
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <map>
#include <queue>
#include <string>
#include <cstring>
#include <deque>
#include <climits>
#include <set>
#include <stack>
#include <tuple>
#include <unordered_map>
#include <sstream>
using namespace std;
using ll = long long;
void init() {
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(false);
}
int main() {
init();
// n은 사람의 수, e는 mt 기간
int n, e;
cin >> n >> e;
// 저장할 노래의 최대 갯수
// vector<int> save[51];
// 각 번호가 가지고 있는 노래 목록
vector<int> mem[101];
// 새로운 요소 인덱스 저장용
int count = 1;
for (int l = 0; l < e; l++) {
int num;
cin >> num;
vector<int> tmp_arr(num);
bool hasSunyoung = false;
for (int i = 0; i < num; i++) {
cin >> tmp_arr[i];
if (tmp_arr[i] == 1)
hasSunyoung = true;
}
if (hasSunyoung) {
for (int person : tmp_arr) {
// save[count].push_back(person);
mem[person].push_back(count);
}
count++;
}
else {
set<int> sharedSongs;
for (int person : tmp_arr) {
for (int song : mem[person]) {
sharedSongs.insert(song);
}
}
for (int person : tmp_arr) {
for (int song : sharedSongs) {
mem[person].push_back(song);
}
}
}
}
// 각 mem 배열에서 중복 제거
for (int i = 1; i <= n; i++) {
sort(mem[i].begin(), mem[i].end());
mem[i].erase(unique(mem[i].begin(), mem[i].end()), mem[i].end());
}
// 모든 노래를 아는 사람 찾기
set<int> allSongs;
for (int i = 1; i < count; i++) {
allSongs.insert(i);
}
vector<int> allKnownPeople;
for (int i = 1; i <= n; i++) {
set<int> personSongs(mem[i].begin(), mem[i].end());
if (includes(personSongs.begin(), personSongs.end(), allSongs.begin(), allSongs.end())) {
allKnownPeople.push_back(i);
}
}
// 오름차순 출력
sort(allKnownPeople.begin(), allKnownPeople.end());
for (int person : allKnownPeople) {
cout << person << "\n";
}
cout << "\n";
return 0;
}
'PS > BOJ' 카테고리의 다른 글
[백준] 10808. 알파벳 개수(c++) (0) | 2025.01.13 |
---|---|
[백준] 23842. 성냥개비(c++) (0) | 2024.12.27 |
[백준] 1246. 온라인 판매(c++) (0) | 2024.12.24 |
[백준] 12789. 도키도키 간식드리미(c++) (0) | 2024.12.23 |
[백준] 18111. 마인크래프트(c++) (0) | 2024.12.19 |