사칙연산만을 지원하는 계산기를 만드는 코드이다.
다행스럽게도 계산식은 <정수> <연산 기호> <정수> 형태이다.
또한, <연산 기호>는 사칙 연산의 4가지밖에 없으며, 나머지는 소수점마저 버린다.
4개밖에 없기에 간단한 하드 코딩 문제라고 생각할 수 있다.
result = 0
for _ in range(int(input())):
result += int(eval(input()))
print(result)
파이썬에서는 eval() 내장 함수를 사용하면 하드 코딩 없이 간단하게 풀 수 있다.
eval() 함수는 식을 문자열로 받아들여 그 식을 실행하는 함수이다.
예를 들어 "10 + 13"이라는 문자열을 받아들이면, 문자열을 제외한 10 + 13 식을 수행한다.
이때 int()로 감싸주는 이유는, 1번 문제와 같은 원리이다. 소수점을 버리기 위한 함수이다.
이처럼 4줄로 '합 계산기' 코드는 끝난다.
# eval()
num = 1
num = eval("num + 4")
print(num) # 5
# exec()
num = 1
exec("num += 4")
print(num) # 5
eval()과 유사한 exec() 함수가 있다.
eval() 함수는 '식'만을 인수로 받는다면, exec() 함수는 '구문'을 인수로 받는다.
즉, exec()는 코드 자체를 문자열로 받아서 수행할 수 있다는 거다.
└ 예시) exec("newVar = var + var")
└ 예시) exec("list(map(int, input().split()))")
함수 내부에서 문자열을 실행하는 이 두 함수는 변수들을 동적으로 사용할 수 있어 편리하다.
하지만 그만큼 Command injection 공격에 취약하다.
Command injection 공격은 특정 명령을 스크립트 내부에 삽입하여 실행하는 공격을 말한다.
따라서 eval()과 exec() 함수를 실제 프로그램에서 사용할 때는, 사용자 값이 적절한지 검증하는 과정이 필요하다.
'PS > 9oormthon Challenge' 카테고리의 다른 글
구름톤 챌린지 Week 2 - Day 6 (0) | 2023.08.25 |
---|---|
구름톤 챌린지 Week 1 - Day 5 (0) | 2023.08.19 |
구름톤 챌린지 Week 1 - Day 4 (0) | 2023.08.19 |
구름톤 챌린지 Week 1 - Day 2 (0) | 2023.08.19 |
구름톤 챌린지 Week 1 - Day 1 (0) | 2023.08.19 |