attack_num = int(input("어떤 좀비를 공격하시겠습니까? (숫자 입력) "))
# 1 ~ len(current_stage.zombies) 사이가 아닌 경우
if attack_num < 1 or attack_num > len(current_stage.zombies):
print("잘못된 입력입니다. 다시 입력해주세요.")
continue
# 1 ~ len(current_stage.zombies) 사이의 숫자인 경우
else:
zombie = current_stage.zombies[attack_num-1]
action = input("어떤 공격을 사용하시겠습니까? (1: 일반공격, 2: 마법공격) ")
if action == "1":
player.normal_attack(zombie)
elif action == "2":
player.magic_attack(zombie)
else:
print("잘못된 입력입니다. 다시 입력해주세요.")
continue
attack_num에서 숫자를 입력 받아서 1부터 current_stage.zombies라는 리스트의 길이만큼의 사이에 있는 숫자라면 통과시키고, 아니면 잘못된 입력으로 보낸다.
근데 문제는, 1.1과 같은 소숫점이 있는 숫자가 입력되면 함수가 돌아가지 않고 invalid literal for int() with base 10: '1.1'
라는 오류가 뜨면서 아예 함수 자체가 실행이 안된다.
attack_num = input("어떤 좀비를 공격하시겠습니까? (숫자 입력) ")
int가 앞에 붙어있어서 애초에 소수점 숫자가 안 받아지는 것 같으니, int를 제외하고 돌려보자.
if attack_num < 1 or attack_num > len(current_stage.zombies):
^^^^^^^^^^^^^^
TypeError: '<' not supported between instances of 'str' and 'int'
실패
에러 메세지 뜻은, 부등호 비교가 문자열이랑 int끼리는 안 된다는 소리다.
저걸 비교하기 위해서는 input 받아온 attack_num을 비교할 수 있게 같은 형식으로 바꿀 필요가 있다.
int로 감싸보자.
attack_num = input("어떤 좀비를 공격하시겠습니까? (숫자 입력) ")
# 1 ~ len(current_stage.zombies) 사이가 아닌 경우
if int(attack_num) < 1 or int(attack_num) > len(current_stage.zombies):
print("잘못된 입력입니다. 다시 입력해주세요.")
continue
if int(attack_num) < 1 or int(attack_num) > len(current_stage.zombies):
^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: '1.1'
안 된다.
아까 발생했던 오류랑 똑같다. 소수는 int가 안 된다는 뜻이다. 애초에 ValueError가 떠도 종료가 안 되고 돌아갈 수 있게 만들면 좋을텐데...
생각해보니 오류를 넘겨주는 방법이 있다!!
try
except
구문에 발생한 오류 구문을 넣어서 넘겨주는 방법이 있다.
나의 경우 발생한 에러 종류가 ValueError
니 except
옆에 ValueError
를 넣어주면 된다.
try:
attack_num = int(input("어떤 좀비를 공격하시겠습니까? (숫자 입력) "))
if attack_num < 1 or attack_num > len(current_stage.zombies):
print("잘못된 입력입니다. 다시 입력해주세요.")
continue
else:
zombie = current_stage.zombies[attack_num-1]
except ValueError:
print("잘못된 입력입니다. 다시 입력해주세요.")
continue
이런 식으로 에러가 발생해도 종료되지 않고 계속 진행될 수 있게 해준다.
해결!!
try
except
구문을 함부로 남발하면 오류가 뭔지 알 수 없게 하는 원인이 된다고 했는데, 적절히 사용하면 오히려 파일이 문제 없이 구동할 수 있게 만들 수 있구나를 느꼈다.
가위는 2 바위는 0 보는 5로 표현합니다.
가위 바위 보를 내는 순서대로 나타낸 문자열 rsp가 매개변수로 주어질 때,
rsp에 저장된 가위 바위 보를 모두 이기는 경우를 순서대로 나타낸 문자열을 return하도록 solution 함수를 완성해보세요.
def solution(rsp):
win_list = []
for num in rsp:
if num == '2':
win_list.append('0')
elif num == '0':
win_list.append('5')
else:
win_list.append('2')
return ''.join(win_list)
def solution(rsp):
d = {'0':'5','2':'0','5':'2'}
return ''.join(d[i] for i in rsp)
이걸 바탕으로 내 코드를 리뷰하면
1. 굳이 리스트에 집어 넣어서 for문으로 돌려 뺄 필요가 없다
2. 리스트는 한 묶음에 값 하나, 딕셔너리는 한 묶음에 key값이랑 value값, 총 두개를 담기 때문에
1:1으로 값을 바꿀 땐 딕셔너리를 이용하면 훨씬 깔끔하게 코드를 짤 수 있다 !
알고리즘 문제를 풀다보면 진짜 신박한 남의 코드를 많이 보게 되는데, 보면서 많이 배우게 된다
계속 공부하다가 보면 문제를 봤을때 아 저건 몇줄로 가능하지 ㅋㅋ 하고 자신하게 되는 날이 오겠지?