백준 1620번 풀이

문제

포켓몬 전국도감 번호->이름/이름->전국도감 번호 말하기. (입력 순서가 일단 전국도감 아니면 관동 도감같은데…)

Reference

https://seraup.dev/10

https://blockdmask.tistory.com/556

풀이

해시는 나도 뭔지 잘 모르는데 아무튼 빠르다고 한다. 그보다 일단 18년차 포덕으로서… 몇가지 정정하고 가도록 합시다… 문제적 허용으로 봐주세요 여러분.

  1. 문제에 나온 도감 번호는 관동 도감으로 추정된다. (오박사가 아직 전국도감 안준듯)
  2. 보통 리그에서 챔피언 뚝배기 깨면 전국도감으로 업그레이드는 걍 해준다. FRLG는 도감에 일정 마리수 이상 등록도 해야 하는데 BDSP는 걍 챔피언 깨니까 업글해줌. (물론 채우면 보상이 있다) 
  3. 7세대부터 인게임에서는 전국도감이 없어졌다. (BDSP의 경우 전국도감이 생기긴 했는데 5세대 이후로는 못 와서 의미가 없음) 7세대까지는 포켓몬 뱅크, 8세대부터는 포켓몬 홈에서 전국도감을 확인할 수 있다.
  4. 스타팅으로 받자마자 솔라빔 쓰는 이상해씨는 없습니다… 보통 이런 고위력기 자력기로 배우려면 5~60 넘겨야 한다. 피카츄도 번개까지 배우고 라이츄 만들려면 63인가까지 키워야 한다. 피카츄가 물몸이라 사리 많이 적립된다 10만볼트 자력기로 가르치려면 라이츄 만들고 살리거나 피카츄 50대까지 쌩으로 키워야 한다. 아님 기술머신 쓰거나…
  5. 오바람(라이벌)이 스타팅으로 이브이를 가져가는 건 피카츄 버전입니다. 그리고 피카츄 버전은 저 그래픽으로 나온 게 없음. 최근 리메이크 되긴 했는데 그게 스위치 버전으로 렛츠고 피카브이 나온거라 3D 그래픽임. 그거랑은 별개로 스토리에서 이 고증은 어쨌든 잘 살린 게 맞음.
  6. 전국도감이 지금 905마린가 906마린가 그래서 절대 문제에 뒷번호까지 못 나온다. (러브로스가 905번인가 그럼) 그리고 나도 다 못 외운다.
  7. 다솜씨 그거 홈에서 모으면 500년 전 마기아나 줍니다. (일단 환상의 포켓몬 중 멜탄/멜메탈도 채워야 함) 다솜씨 포고 시작하겠네
  8. 1세대(+리메이크)는 주인공이 풀밭으로 나가려고 하면 어머 얘 밖은 위험하니 이걸 데려가렴 하면서 스타팅을 줍니다. (퀴즈 ㄴㄴ 밖은 위험하니 ㅇㅇ)
  9. 본가는 스토리 라인상 스토리 초반에 리그장에 갈 일이 없다. 악의 조직 뚝배기 깨고 체육관 뚝배기 깨느라 바쁘다.

더 쓸 거 많은데 일단 문제 풀이도 해야 하니 여기까지 합시다.

사실 나도 해시 테이블이 뭔지는 잘 모르는데 뭔가 되게 빨리 찾을 수 있는 모양이더라… 아, 이 문제에서 그래서 해시 테이블을 만드냐면 그건 아니고 딕셔너리로 풀 거다.

import sys

N, M = map(int, sys.stdin.readline().split())
pokemon_name = []
pokemon_dic = {}

N은 포켓몬 도감 딕셔너리(…) 그니까 관동도감 상위 n마리를 뜻하고, M은 거기서 문제가 몇 개냐를 얘기한다. 즉 N이 28이면 이상해씨~모래두지까지라는 얘기다. 뮤츠는요 150 치면 되지 않을까 이쯤되면 전국도감 크롤링 하는 게 빠를듯 

for i in range(N):
    pokemon = sys.stdin.readline().strip()
    pokemon_name.append(pokemon)
    pokemon_dic[pokemon] = i + 1

짜잔. 그래서 리스트와 딕셔너리가 나오는데요… 응? 그럼 리스트는 그저 딕셔너리의 중간과정에 불과한건가요? 놉, 그건 이따 설명해드림.

for _ in range(M):
    pokemon_find = sys.stdin.readline().strip()
    if pokemon_find.isdigit():
        print(pokemon_name[int(pokemon_find) - 1])
    else: 
        print(pokemon_dic[pokemon_find])

문제가 두 가지 케이스인데 포켓몬 이름을 말하면 도감번호를, 도감번호를 말하면 포켓몬 이름을 찾아야 한다. 포켓몬 이름을 말하면 도감번호를 반환하는 건 포켓몬 이름을 키로 검색해서 딕셔너리 밸류 뽑으면 되는데… 그럼 도감 번호는??? 헐 이거 밸류로 찾을 수 있어요? 아니 그래서 리스트가 필요한거임.

isdigit()는 입력값이 숫자인지를 확인해주는거기 때문에 알파벳이건 한글이건 빵상빵상이건 외계어건 마인크래프트어건 안농핫삼이건 문자열이 있으면 false다. 매우 순수하게 숫자만 있어야 True기 때문에 isdigit()이 true라는 건 숫자만 있다, 즉 도감 번호라는 얘기니까 정수형으로 변환한 다음 거기에 1을 빼서 인덱싱하면 된다. 참 쉽죠?