본문 바로가기
코딩테스트 준비/백준

[백준 1620번] 나는야 포켓몬 마스터 이다솜

by rahites 2022. 1. 13.

 

# 전직 포켓몬 마스터로서 문제의 제목을 보자마자 참을 수 없었다.

 

하지만 포켓몬 마스터의 길은 멀고도 험했다...

 

-- 처음 짠 코드

import sys

N, M = map(int, input().split())
# 도감에 수록되어있는 포켓몬의 개수 N, 맞춰야 하는 문제의 개수 M

dogam = {}
for i in range(N):
    dogam[i+1] = sys.stdin.readline().strip()
question = []
for i in range(M):
    question.append(sys.stdin.readline().strip())

for i in range(len(question)):
    # 숫자의 string형과 일반 string이 섞여있을 때 이를 판단 ( 예외 처리 )
    try:
        question[i] = int(question[i])
    except ValueError:
        question[i] = question[i]
    # 바꾼 타입이 int -> 딕셔너리의 값을 프린트
    # 바꾼 타입이 str -> 딕셔너리의 키를 프린트
    if type(question[i])==int:
        print(dogam[question[i]])
    else:
        # 딕셔너리의 값으로 키를 프린트
        for key, value in dogam.items():
            if value == question[i]:
                print(key)

코드를 다 짜고 시간 초과가 나올 것 같다는 생각이 들었는데 예상이 적중했다!! 예시를 넣었을 때는 당연히 정답이 맞고, 코드를 짠 방법은 입력받은 도감을 딕셔너리 형태로 "숫자 : 포켓몬 이름"으로 정리했다. 그리고 숫자를 입력받으면 키를 기준으로 값을 출력하고 포켓몬 이름을 입력받으면 값을 기준으로 키를 출력 받도록하였다. 

 

시간초과가 나는 이유는 왠지 딕셔너리를 items로 모두 반복해가며 key와 value를 받아주는게 너무 오래걸리나?라는 생각이 먼저 들었다. 흠.. 그러면 저 때는 그냥 딕셔너리를 뒤집어 줄까?

 

-- 정답 코드

import sys

N, M = map(int, input().split())
# 도감에 수록되어있는 포켓몬의 개수 N, 맞춰야 하는 문제의 개수 M

dogam = {}
for i in range(N):
    dogam[i+1] = sys.stdin.readline().strip()

dogam2 = {}
for k, v in dogam.items():
    dogam2[v] = k

question = []
for i in range(M):
    question.append(sys.stdin.readline().strip())

for i in range(len(question)):
    # 숫자의 string형과 일반 string이 섞여있을 때 이를 판단 ( 예외 처리 )
    try:
        question[i] = int(question[i])
    except ValueError:
        question[i] = question[i]
    # 바꾼 타입이 int -> 딕셔너리의 값을 프린트
    # 바꾼 타입이 str -> 딕셔너리의 키를 프린트
    if type(question[i])==int:
        print(dogam[question[i]])
    else:
        # 딕셔너리의 값으로 키를 프린트
        print(dogam2[question[i]])

'숫자 : 포켓몬' 으로 되어있는 dogam과 '포켓몬 : 숫자'로 되어있는 dogam2를 미리 만들어 놓고 반복문에서는 키를 사용해 원하는 값을 뽑아내기만 하면 되도록 코드를 짜보았다. 결과는 성공!! 

 

이번 문제에서 주목할 만한 점은

1. items를 활용해 값을 가지고 키를 꺼내오는 점

2. try except구문의 예외처리를 사용

이다~!!

 

 

오늘도 성공적으로 포켓몬 도감을 완성해주었다.

댓글