[BOJ_Python] 1620번 나는야 포켓몬 마스터 이다솜 (실버 4)

황준성·2024년 10월 30일
0

BOJ_Python

목록 보기
10/70

문제 1620


오박사 : 그럼 다솜아 이제 진정한 포켓몬 마스터가 되기 위해 도감을 완성시키도록 하여라. 일단 네가 현재 가지고 있는 포켓몬 도감에서 포켓몬의 이름을 보면 포켓몬의 번호를 말하거나, 포켓몬의 번호를 보면 포켓몬의 이름을 말하는 연습을 하도록 하여라. 나의 시험을 통과하면, 내가 새로 만든 도감을 주도록 하겠네.

입력 예시 1

26 5
Bulbasaur
Ivysaur
Venusaur
Charmander
Charmeleon
Charizard
Squirtle
Wartortle
Blastoise
Caterpie
Metapod
Butterfree
Weedle
Kakuna
Beedrill
Pidgey
Pidgeotto
Pidgeot
Rattata
Raticate
Spearow
Fearow
Ekans
Arbok
Pikachu
Raichu
25
Raichu
3
Pidgey
Kakuna

출력 예시 1

Pikachu
26
Venusaur
16
14

문제 이해

문제를 보고 조금 당황스럽긴 했다. 보통의 문제와는 다른 찐의 냄새가 나는 문제였고, 그래서 더 반갑고 재미있었다.

이 문제는 실버 4 문제이기는 한데 체감상 그 정도 난이도는 아닌 것 같다. 복잡한 알고리즘이 쓰이는 것도 아니고 복잡한 구조도 아니다. 대신에 이 문제에서는 딕셔너리를 사용한다.

문제 풀이

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

poketmon = []

n, m = map(int, input().split())

for i in range(n):
    poketmon.append(input())

for i in range(m):
    value = input()
    # 들어온 값이 알파벳일때
    if value.isalpha():
        print(poketmon.index(value) + 1)
    # 들어온 값이 숫자일때
    else:
        print(poketmon[int(value)-1])

처음에는 위 코드 처럼 리스트로 만들어서 구현을 했는데, 시간 초과가 났다. Chat GPT가 말하길 해당하는 값의 인덱스를 찾아주는 .index()함수가 시간을 많이 잡아먹는 다고 한다. 아직 시간 복잡도에 대해서는 공부하지 않았기에 잘 모르지만, 돌아가는 로직이 효율적이지 않는 것 같다. 숫자가 들어왔을 때는 크게 문제가 없기 때문에 알파벳으로 입력이 들어왔을 때 리스트 대신에 다른 방법을 써야 한다. 그게 바로 딕셔너리다.

내가 짠 코드

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

poketmon = []
poketmon_name = {}

n, m = map(int, input().split())

for i in range(n):
    name = input()
    poketmon_name[name] = i + 1 # key값과 맵핑을 위해
    poketmon.append(name)

for i in range(m):
    value = input()
    # 들어온 값이 알파벳일때
    if value.isalpha():
        print(poketmon_name[value])
    # 들어온 값이 숫자일때
    else:
        print(poketmon[int(value)-1])

딕셔너리를 만들어서 처음에 도감에 넣을 값을 받을때, 리스트에는 이전과 같이 넣어주고, 딕셔너리에는 key값으로 문자열을 넣어준다. 그리고 key값에 대한 값으로는 도감 번호 값을 넣어준다. 입력을 문자열로 받았을 때, 그것을 키값으로 번호를 찾을 것이기 때문에 key값으로 문저열을 받는다.

이후에는 위에서 말했듯이 어려운 개념이 전혀 없다. 브론즈 2 정도의 난이도 같이 느껴진다. 그러고보면 백준에서 문제 난이도는 어떤 기준으로 부여하는지 궁금하다.

profile
Make progress

0개의 댓글