새소식

BOJ/[BOJ] Python

백준 1620번 풀이

  • -

문제

https://www.acmicpc.net/problem/1620

 

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

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

www.acmicpc.net

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

 

Reference

https://seraup.dev/10

 

백준 1620번 나는야 포켓몬 마스터 이다솜 (Python)

문제 포켓몬의 수 N, 내가 맞춰야하는 문제의 수 M. N개의 줄에 포켓몬의 이름이 입력으로 들어옴. 그 다음 줄부터 M개의 줄에 맞춰야하는 문제가 입력으로 들어옴. 숫자로 들어오면 포켓몬 번호

seraup.dev

https://blockdmask.tistory.com/556

 

[python] 파이썬 isdigit 숫자 판별

안녕하세요. BlockDMask 입니다. 오늘은 파이썬에서 문자열이 숫자로 이루어졌는지 확인하는 isdigit 에 대해서 이야기해보려합니다. 파이썬 isdigit 설명 1-1) isdigit 설명 isdigit은 string 클래스에 있는

blockdmask.tistory.com

 

풀이

해시는 나도 뭔지 잘 모르는데 아무튼 빠르다고 한다. 그보다 일단 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을 빼서 인덱싱하면 된다. 참 쉽죠? 

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 10807번 풀이  (0) 2022.11.13
백준 10815번 풀이  (0) 2022.10.12
백준 18870번 풀이  (0) 2022.09.30
백준 10814번 풀이  (0) 2022.09.29
백준 1181번 풀이  (0) 2022.09.29
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.