Computer Knowledge/코테 대비 오답노트

[python] 문자열 계산하기 - eval

l._.been 2023. 5. 27. 17:18
728x90
문제

https://school.programmers.co.kr/learn/courses/30/lessons/120902

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문자열로 주어진 식을 계산해서 결과값을 리턴하는 문제이다.

예를들어 "3 + 7" 이 문자열로 주어졌으면 결과값은 10 이어야한다.

 

나의 풀이
def solution(my_string):
    oper = []
    nums = []
    for i in my_string.split():
        if i.isdigit():
            nums.append(int(i))
        else:
            oper.append(i)
    oper= oper[::-1]
    nums= nums[::-1]
    while oper:
        o = oper.pop()
        a,b = 0,0
        if o == '+':
            a = nums.pop()
            b = nums.pop()
            nums.append(a+b)
        else:
            a = nums.pop()
            b = nums.pop()
            nums.append(a-b)
    return nums[0]

나는 빙구인가 ㅋㅋㅋㅋ.. 이렇게 안 해도 된다 다른 사람들의 풀이를 보니까 파이썬 내장함수 eval를 사용한 사람도 있고

split을 사용해서 풀었던 사람들도 있었다.

 

인상적인 풀이

 

1. 내장함수 eval

solution=eval

ㅋㅋㅋㅋㅋㅋ.. 이렇게도 풀릴 수도 있구나

파이썬 공식 문서 eval()을 참고할 수 있는 사이트이다

https://docs.python.org/ko/3/library/functions.html#eval

 

Built-in Functions

The Python interpreter has a number of functions and types built into it that are always available. They are listed here in alphabetical order.,,,, Built-in Functions,,, A, abs(), aiter(), all(), a...

docs.python.org

eval은 사용성이 넓고 유용하게 느껴질 수 있지만 이런 자유스러움은 독이 될 수도 있기 때문에 사용을 자제해야한다.

서버의 root 디렉토리의 정보가 그대로 노출될 수도 있다. 

eval() 함수는 표현식을 그대로 실행하는 것이기 때문에 Command Injection Flaws를 그대로 노출할 수 있으며 대형 참사로 이어질 수 있다. 이는 시스템 명령을 삽입할 수 있는 스크립트 언어(PHP, Javascript 등)은 모두가 갖고 있는 취약점이다.

뿐만 아니라, eval()명령은 코드의 가독성을 떨어뜨리고 디버깅을 어렵게 만들수 있다.  또한 eval를 사용해 일부 로컬 환경에 의존하도록 구현하면 환경 의존성도 생길 수 있으므로 되도록 사용하지 않는 방향을 권장한다.

 

eval 사용을 왜 지양해야 하는지 예시와 함께 이해하고 싶다면 아래 사이트를 방문하길 바란다

https://bluese05.tistory.com/64

 

python eval() 함수 - 사용을 조심해야 하는 이유

python eval() 함수 python 의 built-in 함수 중 하나인 eval 함수는 매우 강력하면서도 사용을 자제 하도록 권고하는 양날의 검과 같은 기능이다. 먼저 python docs 의 정의를 보자. eval(expression, globals=None, loc

bluese05.tistory.com

 

2. split, replace

def solution(my_string):
    return sum(int(i) for i in my_string.replace(' - ', ' + -').split(' + '))

나는 이 풀이가 가장 마음에 들었다.

my_string 문자열에 있는 빼기(' - ')를 숫자에 음수(' + -')로  바꾼 다음, 더하기(' + ') 단위로 나눠서 모든 숫자들을 더한다.

예를들어,

my_string = '3 - 10 + 11' 이 있다면, replace(' - ', ' + -')를 거쳐낸 결과는 아래와 같다.

my_string = '3 + (-10) + 11'

여기서 split('+')을 통과한 결과는 '3', '-10', '11' 이다.

이 값들이 sum연산과 for문을 통해서 다같이 더해져서 4가 된다.