-
백준 1620 파이썬 | 나는야 포켓몬 마스터 이다솜알고리즘 BOJ 2021. 8. 29. 16:58
코드
from sys import stdin input = stdin.readline dic1 = {} N, M = map(int, input().split()) # N 개의 줄 입력 for i in range(1, N+1): s = input().strip("\n") # 딕셔너리에 추가 -> {번호: 이름, 이름: 번호} dic1[str(i)] = s dic1[s] = str(i) # M 개의 줄 입력 for j in range(M): t = input().strip("\n") print(dic1[t])
설명
N 번의 포켓몬 이름이 입력으로 주어진다. 입력 받은 순서대로 포켓몬에게 번호가 매겨진다.
그 후에 M 번 만큼 포켓몬 이름 or 번호를 입력 받는다. 이름을 입력 받으면 그에 맞는 번호를, 번호를 입력 받으면 그에 맞는 이름을 출력해 주면 된다.
포켓몬의 이름과 번호가 매칭되기 때문에 파이썬의 딕셔너리 구조를 이용하여 문제를 풀기로 했다.
까다로운 부분은 M개 줄에 걸쳐 질의가 들어오는 부분이다. 처음에는 { 번호 : 이름 }의 구조로만 받았다. 그랬더니 번호를 받았을 때는 이름을 가져올 수 있지만, 이름을 받았을 때 번호를 가져올 수 없었다.
그래서 다시 조건에 N의 범위를 보았다. 1 <= N <= 100,000 이니 그리 크지 않다. 따라서 N개 줄의 입력을 받아올 때 딕셔너리에 {이름 : 번호, 번호 : 이름} 의 두 가지 구조를 모두 추가하였다. 그렇게 해도 딕셔너리에 포함되는 요소 수가 최대 200,000 으로 크지 않다. 그러면 M개 줄의 입력에서 번호를 받든, 이름을 받든, 그에 맞는 출력을 가져올 수 있다.
자료형이 꼬이지 않게 번호 부분은 모두 문자열로 처리해서 딕셔너리에 넣으면 편하다. 문자열 "1" 과 정수 1 은 같지 않아서 자료형을 고려하지 않고 쓰면 고장난다.
메모리: 62484 KB
시간: 380 ms
문제
https://www.acmicpc.net/problem/1620
1620번: 나는야 포켓몬 마스터 이다솜
첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면
www.acmicpc.net
다른 풀이
특이한 풀이로는 파이썬의 isdigit, isalpha를 이용해서 M개 줄의 입력에서 케이스를 분리시켜 놓고 문제를 풀 수도 있다. isdigit 과 isalpha 는 문자열이 숫자로 구성되었는지, 알파벳으로 구성 되있는지 True False 값을 리턴한다. "문자열".isdialpha() 이런 식으로 쓴다.
import sys n, m = map(int, input().split()) dic = {} name = [] for i in range(n): pk = sys.stdin.readline().strip() dic[pk] = i+1 name.append(pk) for _ in range(m): a = sys.stdin.readline().strip() if a.isdigit(): sys.stdout.write('{}\n'.format(name[int(a)-1])) else: sys.stdout.write('{}\n'.format(dic[a]))
'알고리즘 BOJ' 카테고리의 다른 글
백준 17219 파이썬 | 비밀번호 찾기 (0) 2021.08.30 백준 1764 파이썬 | 듣보잡 (0) 2021.08.30 백준 1676 파이썬 | 팩토리얼 0의 개수 (0) 2021.08.30 백준 17626 파이선 | Four squares (0) 2021.08.29 백준 골드5 달성 | 파이썬 python (0) 2021.08.23