[BOJ] 16165 - 걸그룹 마스터 준석이
사용 언어: Python3
문제
코드
내 풀이
# 입력 받을 걸그룹의 수 N
# 맞혀야 할 문제의 수 M
N, M = map(int, input().split())
# 걸그룹마다 팀의 이름, 걸그룹의 인원 수, 멤버의 이름을 한 줄씩 차례대로 입력
# init groupDict
groupDict = dict()
for _ in range(N):
groupName, memberCnt = input(), int(input())
members = list()
for _ in range(memberCnt):
members.append(input())
groupDict[groupName] = members
# init questionDict
questionDict = dict()
for _ in range(M):
name, flag = input(), int(input())
questionDict[name] = flag
# output
for x in questionDict:
# 팀에 속한 멤버 이름 출력
if questionDict[x] == 0: # key로 value 찾기
for member in sorted(groupDict[x]): # 사전순!!
print(member)
else: # 멤버가 속한 팀 이름 출력
team = [k for k, v in groupDict.items() if x in v] # ✅ value로 key 찾기
print(team[0])
- 처음에 사전순으로 출력을 하지 않아 틀렸다.. 문제를 꼼꼼히 읽자!!
- value로 key를 찾는 방법이 있긴 하지만 매번 매번 딕셔너리 전체를 순회하면서 가져오기 때문에 비효율적이다.
- 다른 방법으로는 딕셔너리의
{key, value}
를 뒤집어{value: key}
저장해놓고 찾는 방법이 있다.aa = {'0': 'AA', '1': 'BB', '2': 'CC'} bb = {v:k for k,v in aa.items()} # {'AA': '0', 'BB': '1', 'CC': '2'} bb.get('CC') # 결과: '2'
- 다른 방법으로는 딕셔너리의
다른 풀이
# 입력 받을 걸그룹의 수 N
# 맞혀야 할 문제의 수 M
N, M = map(int, input().split())
team_mem, mem_team = {}, {} # ✅ 딕셔너리 선언
# 팀과 멤버를 따로따로 처리할 수 있다! (네이밍은 key_value 형태)
# team_mem (team이 key)
# -> {'twice': ['jihyo', 'dahyeon', 'mina']}
# mem_team (mem이 key)
# -> {'jihyo':'twice'} # ✅ 각 멤버별 team을 value로 가지는 딕셔너리도 선언!
for i in range(N):
groupName, memberCnt = input(), int(input())
team_mem[groupName] = [] # ✅ value에 빈 리스트 정의 (딕셔너리와 리스트 연결)
for j in range(memberCnt):
name = input()
team_mem[groupName].append(name)
mem_team[name] = groupName # ✅ 딕셔너리 업데이트
# 퀴즈 input & output
for i in range(M):
name, flag = input(), int(input())
if flag == 1: # 멤버가 속한 팀 이름 출력
print(mem_team[name])
else: # 팀에 속한 멤버 이름 출력
for mem in sorted(team_mem[name]): # ✅ 사전순!!
print(mem)
- 멤버가 속한 팀의 이름을 출력할 때
- 나는 value로 key를 구할 생각을 했었는데, 애초에 member를 key로 가지고 팀을 value로 가지는 딕셔너리를 하나 더 선언하는 방법이 있었다..!
💛 개인 공부 기록용 블로그입니다. 👻