[python_파이썬]백준_1620번_나는야 포켓몬 마스터 이다솜_풀이

2024. 5. 11. 20:10코드리뷰

728x90
반응형

공부하는허딩크 : https://www.youtube.com/live/S9Tn1JM6-yc?feature=shared

문제가 너무 길다. 다 필요 없고 입력과 출력 조건만 보면 된다.

 

결론은 도감에 수록되어 있는 몬스터들이 있다. 그 다음 문제로 내는 몬스터 이름과 숫자가 도감에 있는지 여부 및 출력하는 것이다. 

 

시간제한 2초로 도감을 list로 만들어서 enumerate로 인덱스와 값을 찾아서 문제를 풀기에는 일단 시간초과가 나올 것으로 예상되었다.

 

<첫번째 시도 : 시간초과>

일단 도감을 dict로 만들어주고 문제를 하나씩 받아서 value와 key값을 비교 후 출력함 => 이중for문 사용

#시간초과 : 이중for문을 풀어야함.
N, M = map(int, input().split())
monster = {}

for i in range(1, N + 1):
    name = input().strip()
    monster[i] = name

for _ in range(M):
    question = input().strip()
    for key, value in monster.items():
        if question == value:
            #print("정답 :", key)
            print(key)
        elif question == str(key):
            #print("정답 :", value)
            print(value)

 

<두번째 시도 : 통과>

도감을 dict로 만들어 주는 건 동일하나, 도감을 2개 만들었다. key와 value가 반대로 되는 도감을 하나 더 만들어서

문제를 받을때 마다 if로 조건 체크 후 출력함.

import sys
input = sys.stdin.readline

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

for i in range(1, N + 1):
    name = input().strip()
    monster[str(i)] = name
   
monster_reverse = {value: key for key, value in monster.items()}
for _ in range(M):
    question = input().strip()
    if question in monster.keys():
        print(monster[question])
    elif question in monster_reverse.keys():
        print(monster_reverse[question])

 

<다른사람풀이 참고>

1. 도감 만들때 부터 2개로 만든다. : 굳이 나중에 iterms()사용 하지 않아도 됨.

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

for i in range(1, N + 1):
    name = input().strip()
    monster[str(i)] = name
    monster[name] = str(i)

 

2. isdigit()과 isnumeric() 사용

    ㄴ isdigit()은 0~9까지의 숫자로만 사용되었는지 확인 : 소수점이나 음수 기호와 같은 다른 유형의 숫자는 인식하지 않음

    ㄴ isnumeric()은 isdigit보다 더 넓은 범위 숫자형식 : 유니코드의 숫자형식, 로마숫자, 중국어숫자등

내 코드보다 아래의 코드로 수정하는 것이 조금 더 효율적이고 가독성이 좋다.

import sys
input = sys.stdin.readline

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

for i in range(1, N + 1):
    name = input().strip()
    monster[i] = name
    monster_re[name] = i
   

for _ in range(M):
    question = input().strip()
    if question.isdigit():
        print(monster[int(question)])
    else:
        print(monster_re[question])

 

3. try, except사용 : 나도 코드 작성시 이걸 생각했는데 굳이 필요 없을 것 같아서 안했음. try except가 아직 익숙하지 않음.

import sys
input = sys.stdin.readline

N, M = map(int, input().split())
monster = {}
monster_re = {}
answer = []

for i in range(1, N + 1):
    name = input().strip()
    monster[i] = name
    monster_re[name] = i
   

for _ in range(M):
    question = input().strip()
    try:
        num = int(question)
        answer.append(monster[num])
    except ValueError:
        answer.append(monster_re[question])

for i in answer:
    print(i)
728x90
반응형