코딩테스트

[백준] 16165번 - 걸그룹 마스터 준석이

miniberry 2026. 3. 24. 10:46

1. 문제 요약

https://www.acmicpc.net/problem/16165

  • 여러 개의 아이돌 그룹이 주어진다.
  • 각 그룹에는 여러 멤버가 존재한다.
  • 이후 두 가지 질의가 주어진다.

2. 질의 유형

   1) 0번: 그룹 이름 → 멤버 목록 출력 (사전순)

   2) 1번: 멤버 이름 → 소속 그룹 출력


2. 처음 접근 (리스트 기반)

처음에는 단순하게 생각해서:

  • groups: 그룹 이름 리스트
  • members: 각 그룹의 멤버 리스트

이렇게 저장했다.

 
groups, members = [], [[] for _ in range(n)]
 

그리고 질의 처리 시:

  • 그룹 찾기 → groups 순회
  • 멤버 찾기 → members 전체 순회 + in 검사

이후 오답처리되어 딕셔너리 형식으로도 처리해보았다.


3. 문제점(오답 코드)

 1) 리스트

import sys
input = sys.stdin.readline

n, m = map(int, input().split())

groups, members = [], [[] for _ in range(n)]

for i in range(n):
    group = input().rstrip()
    k = int(input())
    groups.append(group)
    for _ in range(k):
        members[i].append(input().rstrip())
    
for _ in range(m):
    where = input().rstrip()
    quiz = int(input())
    if quiz == 0:
        for i, group in enumerate(groups):
            if where == group:
                print(*members[i], sep='\n')
    if quiz == 1:
        for i, member in enumerate(members):
            if where in member:
                print(groups[i])

 2) 딕셔너리

import sys
input = sys.stdin.readline

n, m = map(int, input().split())

groups = {}
members = {}

for i in range(n):
    group = input().rstrip()
    k = int(input())
    members[group] = []
    for _ in range(k):
        member = input().rstrip()
        groups[member] = group
        members[group].append(member)

for _ in range(m):
    where = input().rstrip()
    quiz = int(input())
    if quiz == 0:
        print(*members[where], sep='\n')
    else:
        print(groups[where])

 


4. 개선 필요성


개선 접근

그래서 문제를 다시 읽어보았다.

퀴즈의 종류가 0일 경우 해당 팀에 속한 멤버의 이름을 사전순으로 한 줄에 한 명씩 출력한다. 

라는 부분이 있었고, 조건에 맞춰 멤버들을 정렬하여 정답을 맞출 수 있었다.


5. 개선 후 코드

 1) 리스트
import sys
input = sys.stdin.readline

n, m = map(int, input().split())

groups, members = [], [[] for _ in range(n)]

for i in range(n):
    group = input().rstrip()
    k = int(input())
    groups.append(group)
    for _ in range(k):
        members[i].append(input().rstrip())
    members[i].sort()
    
for _ in range(m):
    where = input().rstrip()
    quiz = int(input())
    if quiz == 0:
        for i, group in enumerate(groups):
            if where == group:
                print(*members[i], sep='\n')
    if quiz == 1:
        for i, member in enumerate(members):
            if where in member:
                print(groups[i])
 2) 딕셔너리
import sys
input = sys.stdin.readline

n, m = map(int, input().split())

groups = {}
members = {}

for i in range(n):
    group = input().rstrip()
    k = int(input())
    members[group] = []
    for _ in range(k):
        member = input().rstrip()
        groups[member] = group
        members[group].append(member)
    members[group].sort()

for _ in range(m):
    where = input().rstrip()
    quiz = int(input())
    if quiz == 0:
        print(*members[where], sep='\n')
    else:
        print(groups[where])