BOJ 1620. 나는야 포켓몬 마스터 이다솜 (Python)

2021. 2. 19. 12:19Problem Solving/BOJ

BOJ 1620. 나는야 포켓몬 마스터 이다솜

1620번: 나는야 포켓몬 마스터 이다솜 (acmicpc.net)

 

1620번: 나는야 포켓몬 마스터 이다솜

첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면

www.acmicpc.net

풀이

딕셔너리(dictionary)를 이용해서 풀면 된다.
for문을 돌며 인덱스-문자열을 매치시켜 저장하고 이를 문제에 맞게 프린트 해주면 된다.

문제의 핵심은,

 

  1. 딕셔너리의 키-값번호-포켓몬이름으로 저장하면 포켓몬 이름, 즉 문자열이 나왔을때는 어떻게 값으로 키를 뽑아낼 것인가?
  2. int 형이 문제로 들어왔을때와 str(문자열)이 들어왔을때는 어떻게 구분 할 것인가?

일 것이다.

 

키-값을 뒤집은 딕셔너리 생성

문자열이 문제로 나올때마다 포문을 돌려 값에 맞는 키를 찾을 수는 있다.

except ValueError:
        for k, v in dict.items():
            if v == question:
                print(k)

하지만 문제 수가 늘어나면 그만큼 연산 횟수가 증가한다. 실제로 이 코드로 제출해보면 시간 초과 에러가 난다.


연산을 한번만 할 수 있도록 키-값을 바꾼 딕셔너리를 만들어 그 딕셔너리에서 값을 찾는다.

for k, v in dict.items():
    reversed_dict[v] = k
except ValueError:
        print(reversed_dict[question])

 

정수(int)와 문자열(str) 구분

현재 dict는

{1: 'Bulbasaur', 2: 'Ivysaur', 3: 'Venusaur', 4: 'Charmander', 5: 'Charmeleon', 6: 'Charizard', 7: 'Squirtle', 8: 'Wartortle', 9: 'Blastoise', 10: 'Caterpie', 11: 'Metapod', 12: 'Butterfree', 13: 'Weedle', 14: 'Kakuna', 15: 'Beedrill', 16: 'Pidgey', 17: 'Pidgeotto', 18: 'Pidgeot', 19: 'Rattata', 20: 'Raticate', 21: 'Spearow', 22: 'Fearow', 23: 'Ekans', 24: 'Arbok',
25: 'Pikachu', 26: 'Raichu'}

이렇게 구성되어 있다.
정수가 문제로 들어오면 문자열을 출력하고, 문자열이 문제로 들어오면 정수를 출력해야한다.

question = sys.stdin.readline().rstrip()
    try:
        question = int(question)
    except ValueError:
        print(reversed_dict[question])
    else:
        print(dict[question])

문제가 정수인지 문자열인지 구분하기 위해 ValueError를 이용해 예외처리를 했다.

 

try~excepttry에서 에러가 나면 except를 수행하고 에러가 나지 않는다면 else를 수행한다.

 

먼저 int()로 변환 해 본 다음 여기서 ValueError가 난다면 그것은 str이므로 reversed_dict값을 찾고,
에러가 나지 않는다면 그것은 정수이므로 dict에서 값을 찾는다.

 

소스코드

import sys

dict = {}
reversed_dict = {}
N, M = map(int, input().split())

for i in range(1,N + 1):
    dict[i] = sys.stdin.readline().rstrip()

for k, v in dict.items():
    reversed_dict[v] = k

for _ in range(M):
    question = sys.stdin.readline().rstrip()
    try:
        question = int(question)
    except ValueError:
        print(reversed_dict[question])
    else:
        print(dict[question])

 

+) 코드 가독성, 시간 살짝 개선

import sys

dict = {}
reversed_dict = {}
N, M = map(int, input().split())

for i in range(1,N + 1):
    tmp = sys.stdin.readline().rstrip()
    dict[i] = tmp
    reversed_dict[tmp] = i

for _ in range(M):
    question = sys.stdin.readline().rstrip()
    try:
        question = int(question)
    except ValueError:
        print(reversed_dict[question])
    else:
        print(dict[question])

입력받을때 키-값 바꾼 딕셔너리 바로 설정해줌

반응형

'Problem Solving > BOJ' 카테고리의 다른 글

BOJ 1003. 피보나치 함수 (Python)  (0) 2021.02.19
BOJ 1764. 듣보잡 (Python)  (0) 2021.02.19
BOJ 11723. 집합 (Python)  (0) 2021.02.19
BOJ 11866. 요세푸스 문제 0 (Python)  (0) 2021.02.17
BOJ 10828. 스택 (Python)  (0) 2021.02.16