[백준] 1620: 나는야 포켓몬 마스터 이다솜 - 파이썬[python] (feat. dictionary 검색)

다인·2024년 9월 17일

백준

목록 보기
62/112
post-thumbnail

이번에도 딕셔너리를 이용해서 푸는 문제이다. 구글링해보면 대부분 처음부터 2개의 딕셔너리를 만들어서 풀었던데, 나는 values로 key를 찾는 방법으로 많이 쓰이는 방법을 이용하였다.

코드

import sys

N, M = map(int, input().split())
pokemon = {}

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

reversedPokemon = dict(map(reversed, pokemon.items()))

for _ in range(M):
    find = sys.stdin.readline().strip()
    if pokemon.get(find) != None:    # 입력값이 알파벳이다.
        print(pokemon[find])
    else:
        print(reversedPokemon[int(find)])
  • 나도 처음부터 2개의 딕셔너리를 만들거나, 1개의 딕셔너리와 1개의 리스트를 만들까 생각했는데, 딕셔너리의 value로 key를 찾는 방법은 없을까 하여 검색해 보았다.
  • 사실 바로 value로 key를 찾는 방법은 없구.. 딕셔너리의 key와 value를 서로 바꾸어서 새로운 딕셔너리를 만드는 방법을 사용하더라.

딕셔너리의 함수들

get()

  • key로 value값을 찾으려면 그냥 dic['key값']을 이용해도 된다.
  • 그러나 해당하는 key값이 없을 경우 에러를 반환하기 때문에 get()을 사용하기를 권장한다.
  • dic.get('key값')을 사용하면, key값이 없을 때 아무것도 반환하지 않는다. 즉, None이다.
  • 이걸 새롭게 알게 되어서 코드에 사용했는데, 사실 다음과 같이 정수인지 알파벳인지 판단하는 함수를 이용해도 된다.
find.isdigit() == False
find.isalpha() == True

keys()

  • keys()를 사용하면 딕셔너리의 key값들이 리스트로 반환된다.
  • 어차피 도감의 포켓몬 번호는 1부터 증가하는 정수이므로 리스트를 이용하면 더 단간하겠다 싶어서 keys()를 이용해서 포켓몬 이름을 저장하는 리스트를 만드는 코드로도 작성해 보았다.
import sys

N, M = map(int, input().split())
pokemon = {}

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

reversedPokemon = list(pokemon.keys())

for _ in range(M):
    find = sys.stdin.readline().strip()
    if pokemon.get(find) != None:    # 입력값이 알파벳이다.
        print(pokemon[find])
    else:
        print(reversedPokemon[int(find)-1])
  • 리스트는 0부터 증가하므로 입력받은 포켓몬 번호 값에서 1을 빼주어야 한다.

values()

  • values()를 사용하면 딕셔너리의 value값들이 리스트로 반환된다.
  • 참고로 value값은 리스트가 될 수 있다.
  • 만약에 pokemon 딕셔너리의 key값을 포켓몬 이름, value값을 포켓몬 번호로 저장하지 않고 반대로 저장했다면, 위의 코드에서 keys대신 values를 사용해서 리스트를 만들면 되겠다. 물론 밑의 if else 부분도 순서를 바꾸어 줘야겠다.

items()

  • items()는 key값과 value값을 묶어서 리스트로 반환한다.
print(pokemon.items())

하면 아래처럼 출력된다.

dict_items([('Bulbasaur', 1), ('Ivysaur', 2), ('Venusaur', 3), ... ('Raichu', 26)])
  • items()를 이용해서 리스트로 저장하면, 각 행의 0번째와 1번째 열이 각각 key와 value값이 저장된다.
a = list(pokemon.items())
print(a[0][0])
print(a[0][1])
print(a[1][0])
print(a[1][1])

하면 아래와 같이 출력된다.

Bulbasaur
1
Ivysaur
2

결과

역시 reversed를 사용해서 연산을 한 번 더 하는 것보다 바로 리스트를 만들어버리는 게 더 빠르군

0개의 댓글