문제 링크
https://www.acmicpc.net/problem/16165
문제
정우는 소문난 걸그룹 덕후이다. 정우의 친구 준석이도 걸그룹을 좋아하지만 이름을 잘 외우지 못한다는 문제가 있었다. 정우는 친구를 위해 걸그룹 개인과 팀의 이름을 검색하여 외우게 하는 퀴즈 프로그램을 만들고자 한다.
입력
첫 번째 줄에는 총 입력 받을 걸그룹의 수 N(0 < N < 100)과 맞혀야 할 문제의 수 M(0 < M < 100)을 입력받는다.
두 번째 줄부터는 각 걸그룹마다 팀의 이름, 걸그룹의 인원 수, 멤버의 이름을 한 줄씩 차례대로 입력받는다. 팀과 멤버의 이름은 최대 100글자이며, 모든 글자는 알파벳 소문자이다. 하나의 걸그룹이나 서로 다른 두 걸그룹에 이름이 같은 두 멤버가 있는 경우는 없다.
그 다음 줄부터는 M개의 퀴즈를 입력받는다. 각각의 퀴즈는 두 줄로 이루어져 있으며, 팀의 이름이나 멤버의 이름이 첫 줄에 주어지고 퀴즈의 종류를 나타내는 0 또는 1이 두 번째 줄에 주어진다. 퀴즈의 종류가 0일 경우 팀의 이름이 주어지며, 1일 경우 멤버의 이름이 주어진다.
출력
첫 번째 줄부터 차례대로 퀴즈에 대한 답을 출력한다. 퀴즈의 종류가 0일 경우 해당 팀에 속한 멤버의 이름을 사전순으로 한 줄에 한 명씩 출력한다. 퀴즈의 종류가 1일 경우 해당 멤버가 속한 팀의 이름을 출력한다.
예제 입력 1
3 4
twice
9
jihyo
dahyeon
mina
momo
chaeyoung
jeongyeon
tzuyu
sana
nayeon
blackpink
4
jisu
lisa
rose
jenny
redvelvet
5
wendy
irene
seulgi
yeri
joy
sana
1
wendy
1
twice
0
rose
1
예제 출력 1
twice
redvelvet
chaeyoung
dahyeon
jeongyeon
jihyo
mina
momo
nayeon
sana
tzuyu
blackpink
알고리즘 분류
- 자료 구조
풀이
map, set 자료구조를 활용하여 map에는 걸그룹의 순번을, set 배열의 set 원소마다 각 걸그룹에 해당하는 멤버들의 이름을 insert하였다.
그리고 M개의 쿼리를 수행하여, 질문이 0이면 해당 걸그룹 set에 속해 있는 원소들을 전부 출력하고, 질문이 1이면 해당 멤버가 속한 걸그룹의 이름을 출력한다.
코드
#include <iostream>
#include <string>
#include <cmath>
#include <set>
#include <unordered_map>
#include <bitset>
#include <ctime>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#include <climits>
#define FASTIO cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
#define MAX 101
#define LL long long
#define INF 1e9
using namespace std;
int N, M;
unordered_map<string, int> Girl_Group;
set<string> Member[MAX];
unordered_map<string, int>::iterator ITM;
set<string>::iterator ITS;
void Input() {
cin >> N >> M;
for (int i = 0; i < N; i++) {
string S;
int L;
cin >> S;
Girl_Group.insert(make_pair(S, i));
cin >> L;
for (int i = 0; i < L; i++) {
string T;
cin >> T;
Member[Girl_Group[S]].insert(T);
}
}
}
void Settings(string S, int L) {
if (L == 0) {
for (auto ITS = Member[Girl_Group[S]].begin(); ITS != Member[Girl_Group[S]].end(); ITS++) {
cout << *ITS << "\n";
}
}
else if (L == 1) {
for (auto ITM = Girl_Group.begin(); ITM != Girl_Group.end(); ITM++) {
if (Member[Girl_Group[ITM->first]].find(S) != Member[Girl_Group[ITM->first]].end()) {
cout << ITM->first << "\n";
return;
}
}
}
}
void Find_Answer() {
while (M--) {
string S;
int L;
cin >> S;
cin >> L;
Settings(S, L);
};
}
int main() {
FASTIO
Input();
Find_Answer();
return 0;
}
'BOJ > Silver' 카테고리의 다른 글
[BOJ/Silver 3] 백준 17264 I AM IRONMAN(C++) (0) | 2022.05.09 |
---|---|
[BOJ/Silver 1] 백준 2002 추월(C++) (0) | 2022.05.06 |
[BOJ/Silver 3] 백준 13414 수강신청(C++) (0) | 2022.05.06 |
[BOJ/Silver 3] 백준 2910 빈도 정렬(C++) (0) | 2022.05.06 |
[BOJ/Silver 3] 백준 1269 대칭 차집합(C++) (0) | 2022.05.05 |