프로그래밍 공부/python

문자열을 코드로 바꾸는 exec()

sh1256 2023. 1. 24. 00:55
728x90

백준문제 1541번을 풀다가 궁금증이 생겼다.

https://www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다

www.acmicpc.net

 

문자열로 코드를 주면 코드를 그대로 실행해주는 코드는 없을까? 

결과는 역시 있었다. 바로 eval()과 exec()

eval: 파이썬 식 -> 파이썬 컴파일 코드
exec: 문자열 -> 파이썬 컴파일 코드

자세한 설명은 여기 

 

문자열을 python 실행코드로 변환해주는 eval(), exec()

파이썬 내장함수인 eval(), exec()활용한 코드 작성

mindcompass.github.io

그래서 내가 짠 코드

from collections import deque
import sys
def mk_li(arr):
    result=[]
    temp=int(arr[0])
    for i in range(1, len(arr)):
        if arr[i]!='+' and arr[i]!='-':
            temp=temp*10+int(arr[i])
        else: 
            result.append(temp)
            if arr[i]=='+': result.append('+')  
            else : result.append('-')
            temp=0
    result.append(temp)
    return result

#eval(): 파이썬 식-> 파이썬 컴파일 코드
#exec(): 문자열 -> 파이썬 컴파일 코드

a=list(sys.stdin.readline().rstrip())
arr=deque(mk_li(a))#list
arr.insert(0, '(')
i=0
while i<len(arr):
    if arr[i]=='-':
        arr.insert(i, ')')
        arr.insert(i+2, '(')
        i=i+2
    else: i=i+1
arr.append(')')
#print(arr)

m=''.join(str(i) for i in arr)#String
#print(m)
print(eval(m))#<-------------이때 사용

사실 이 풀이 말고 다른 풀이가 더 시간과 메모리 측면에서 우수하게 나왔다. 

 

그리고 리스트를 사용할 때는 deque를 쓰면 훨씬 빠르게 작동!!

'프로그래밍 공부 > python' 카테고리의 다른 글

[python] 파이썬 큰 숫자 입력 꿀팁  (0) 2023.02.14
파이썬 내장함수 enumerate()  (0) 2023.02.14
python 내장함수 zip()  (0) 2023.02.09