[Python] 백준 16165 걸그룹 마스터 준석이 (Dictionary)

선주·2022년 1월 4일
0

Python PS

목록 보기
10/65
post-thumbnail

📌 문제

정우는 소문난 걸그룹 덕후이다. 정우의 친구 준석이도 걸그룹을 좋아하지만 이름을 잘 외우지 못한다는 문제가 있었다. 정우는 친구를 위해 걸그룹 개인과 팀의 이름을 검색하여 외우게 하는 퀴즈 프로그램을 만들고자 한다.

입력

첫 번째 줄에는 총 입력 받을 걸그룹의 수 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


📌 풀이

import sys
input = sys.stdin.readline

n, m = map(int, input().split()) # n은 걸그룹 수, m은 퀴즈 수
team = {}

for _ in range(n):
    name = input().rstrip() # 팀 이름 저장
    team[name] = []
    for _ in range(int(input())): # 멤버 이름 저장
        team[name].append(input().rstrip())
    team[name].sort()

for _ in range(m): # 1: 팀 출력, #0: 멤버 출력
    quiz = input().rstrip()
    if int(input()) == 1:
        print(''.join([k for k, v in team.items() if quiz in v]))
    else:
        print('\n'.join(*[v for k, v in team.items() if quiz in k]))

rstrip()

string의 경우 input()으로 받으면 개행문자 '\n'까지 같이 저장되기 때문에 input().rstrip()으로 끝의 개행문자를 제거해주어야 한다.

dictionary

팀 이름으로도 멤버를 찾을 수 있어야 하고, 멤버 이름으로도 팀을 찾을 수 있어야 하므로 key(팀명): value(멤버) 쌍으로 이뤄지는 dictionary를 사용하기 좋은 문제다.

blackpink: [jenny, jisu, lisa, rose]
redvelvet: [irene, joy, seulgi, wendy, yeri]

↑ 이런 식으로 저장되도록!

  • team = {} # 팀 딕셔너리
  • team[name] = [] # value를 list로
  • team[name].append(input().rstrip()) # 멤버 이름 저장

list comprehension

  • 멤버 이름으로 팀 찾기
# list comprehension 적용 X
for k, v in team.items():
    if quiz in v:
        print(k)
        
# list comprehension 적용 O
print(''.join([k for k, v in team.items() if quiz in v]))
  • 팀 이름으로 멤버 찾기
# list comprehension 적용 X
for k, v in team.items():
    if quiz in k:
        print(*v, sep='\n')
        
# list comprehension 적용 O
print('\n'.join(*[v for k, v in team.items() if quiz in k]))

unpaking

'팀 이름으로 멤버 찾기' 과정에서 list 안에 묶여 있는 멤버 이름들을 한 줄에 하나씩 출력해야 한다.

for k, v in team.items():
    if quiz in k:
        print(v, sep='\n')
['irene', 'joy', 'seulgi', 'wendy', 'yeri']

print문에 sep='\n'을 추가해도 위와 같이 list가 그대로 출력되는데, list 앞에 unpaking 연산자인 *을 붙이면 묶여 있는 값들을 풀어줄 수 있다.

for k, v in team.items():
    if quiz in k:
        print(*v, sep='\n')
irene
joy
seulgi
wendy
yeri
profile
기록하는 개발자 👀

0개의 댓글