BOJ 1620. 나는야 포켓몬 마스터 이다솜 (Python)
2021. 2. 19. 12:19ㆍProblem Solving/BOJ
BOJ 1620. 나는야 포켓몬 마스터 이다솜
1620번: 나는야 포켓몬 마스터 이다솜 (acmicpc.net)
풀이
딕셔너리(dictionary)를 이용해서 풀면 된다.
for문을 돌며 인덱스-문자열을 매치시켜 저장하고 이를 문제에 맞게 프린트 해주면 된다.
문제의 핵심은,
- 딕셔너리의
키-값
을번호-포켓몬이름
으로 저장하면 포켓몬 이름, 즉 문자열이 나왔을때는 어떻게 값으로 키를 뽑아낼 것인가? - 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~except
는 try
에서 에러가 나면 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 |