※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 3018번 문제인 캠프파이어이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/3018
3018번: 캠프파이어
첫째 줄에 MT에 참가한 사람의 수 N이 주어진다. (1 ≤ N ≤ 100) 사람들은 1부터 N까지 번호가 매겨져 있으며, 선영이의 번호는 1이다. 둘째 줄에는 E가 주어진다. (1 ≤ E ≤ 50) 다음 E개 줄에는 그날
www.acmicpc.net
set 자료구조를 이용해 문제를 해결해보자.
i번 사람이 현재 알고 있는 노래를 모두 담고 있는 집합을 st[i]라 하자. 이 때, 1번을 제외한 사람들이 모였을 때에는 각 사람들이 알고 있는 노래의 집합의 합집합을 구해 각 모인 사람의 st[i]를 그 집합으로 바꿔주고, 1번을 포함한 사람들이 모였을 때에는 각 모인 사람의 아는 노래에 새 노래를 하나씩 집어넣는 것으로 문제를 해결할 수 있다. 이 과정에서 1번이 k번째로 만드는 새 노래의 이름을 k로 지으면 구현을 편리하게 할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int N, E;
set<int> st[101];
int num;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> E;
while (E--) {
int K; cin >> K;
vector<int> vec;
set<int> tmp;
bool is_bard = 0;
while (K--) {
int x; cin >> x;
vec.emplace_back(x);
if (x < 2) is_bard = 1;
}
if (is_bard) {
num++;
for (auto& x : vec) st[x].insert(num);
}
else {
for (auto& x : vec) {
for (auto& xx : st[x]) tmp.insert(xx);
}
for (auto& x : vec) {
for (auto& xx : tmp) st[x].insert(xx);
}
}
}
for (int i = 1; i <= N; i++) {
if (st[i].size() == num) cout << i << '\n';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 2942 // C++] 퍼거슨과 사과 (1) | 2023.12.26 |
---|---|
[BOJ 2852 // C++] NBA 농구 (0) | 2023.12.25 |
[BOJ 4649 // C++] Tanning Salon (0) | 2023.12.23 |
[BOJ 4335 // C++] 숫자 맞추기 (1) | 2023.12.22 |
[BOJ 11059 // C++] 크리 문자열 (1) | 2023.12.21 |