eval 함수는 입력받은 식(문자열)을 실행한다. 즉, 계산식을 연산한 결과를 도출해낼 수 있다.
def solution(expression):
operations = [('+', '-', '*'),('+', '*', '-'),('-', '+', '*'),('-', '*', '+'),('*', '+', '-'),('*', '-', '+')]
answer = []
for op in operations:
a = op[0] # 우선순위 1 연산자
b = op[1] # 우선순위 2 연산자
temp_list = []
# 연산자 우선순위 별 계산식 만들기
# 1) 우선순위가 1인 연산자를 기준으로 나누기
for e in expression.split(a):
# 2) 우선순위가 2인 연산자를 기준으로 나누고 괄호 씌우기
temp = [f"({i})" for i in e.split(b)]
# 3) 위에서 나눈 값들을 우선순위가 2인 연산자로 다시 연결하기
temp_list.append(f'({b.join(temp)})')
# 우선순위가 1인 연산자로 다시 연결한 최종 계산식을 실행한 값의 절댓값 구하기
answer.append(abs(eval(a.join(temp_list))))
return max(answer) # 제일 큰 값
위의 코드를 하나씩 살펴보자.
먼저, 문제에서 사용되는 연산자는 총 3종류이기 때문에 미리 연산자 우선순위 조합을 초기화한다.
operations = [('+', '-', '*'),('+', '*', '-'),('-', '+', '*'),('-', '*', '+'),('*', '+', '-'),('*', '-', '+')]
그리고 이 우선순위 조합을 하나씩 적용하여 계산 결과를 구할 것이다. 계산식을 만드는 과정은 다음과 같다.
- 입력받은 문자열을 우선순위가 1인 연산자로 나누기 (split)
- (1)에서 도출한 문자열들을 우선순위가 2인 연산자로 나누기 (split)
- (2)에서 도출한 문자열들을 우선순위가 2인 연산자로 연결하기 (join)
- (3)에서 도출한 문자열들을 우선순위가 1인 연산자로 연결하기 (join)
이렇게 만든 계산식을 eval 함수로 실행하고 그 결과값을 abs를 이용해 절댓값으로 만든다.
for op in operations:
a = op[0] # 우선순위 1 연산자
b = op[1] # 우선순위 2 연산자
temp_list = []
# 연산자 우선순위 별 계산식 만들기
# 1) 우선순위가 1인 연산자를 기준으로 나누기
for e in expression.split(a):
# 2) 우선순위가 2인 연산자를 기준으로 나누고 괄호 씌우기
temp = [f"({i})" for i in e.split(b)]
# 3) 위에서 나눈 값들을 우선순위가 2인 연산자로 다시 연결하기
temp_list.append(f'({b.join(temp)})')
# 우선순위가 1인 연산자로 다시 연결한 최종 계산식을 실행한 값의 절댓값 구하기
answer.append(abs(eval(a.join(temp_list))))
최종적으로 구한 결과값들 중 제일 큰 값을 리턴한다.
return max(answer) # 제일 큰 값
split과 join을 이용해서 계산식을 만들 수 있었는데, 생각해 내지 못했다. 문제에서 입력값이 문자열인 이유가 있었던 것이다. 다음부턴 입력값이 문자열이면 문자열 관련 함수를 떠올리자. 그리고 이번에 eval 함수를 처음 알게 되었다. 문자열 형태의 계산식을 입력하여 연산하고 싶을 땐 eval 함수를 잊지 말자!