[오답노트 | 파이썬] 프로그래머스 - 수식 최대화

Minji Kim·2022년 4월 13일
0

오답노트

목록 보기
5/11
post-thumbnail

문제

풀지 못한 이유

  • 연산자의 우선순위 조합을 미리 정의해놓고 하나씩 적용하여 계산해 보며, 최종적으로 제일 큰 값을 리턴하려고 했다. 하지만 문자열인 값들을 어떻게 연산해야 할지 모르겠다.

풀이) eval 함수 이용

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. 입력받은 문자열을 우선순위가 1인 연산자로 나누기 (split)
  2. (1)에서 도출한 문자열들을 우선순위가 2인 연산자로 나누기 (split)
  3. (2)에서 도출한 문자열들을 우선순위가 2인 연산자로 연결하기 (join)
  4. (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 함수를 잊지 말자!

profile
iOS Developer

0개의 댓글