코딩테스트 연습 - 수식 최대화
IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과 �
programmers.co.kr
<다른 사람 코드>
def calc(priority, n, expression):
if n == 2: # 마지막 연산까지 마친 경우
return str(eval(expression))
if priority[n] == '*':
res = eval('*'.join([calc(priority, n+1, e)
for e in expression.split('*')]))
if priority[n] == '+':
res = eval('+'.join([calc(priority, n+1, e)
for e in expression.split('+')]))
if priority[n] == '-':
res = eval('-'.join([calc(priority, n+1, e)
for e in expression.split('-')]))
return str(res)
def solution(expression):
answer = 0
priorities = [
('*', '-', '+'),
('*', '+', '-'),
('+', '*', '-'),
('+', '-', '*'),
('-', '*', '+'),
('-', '+', '*')
]
for priority in priorities:
res = int(calc(priority, 0, expression))
answer = max(answer, abs(res))
return answer
eval(), join() 함수를 이용해 재귀 호출로 문제를 풀었다.
eval(문자열) : 문자열로 표현된 파이썬 식을 인수로 받아 결괏값을 주는 함수다.
' ? '.join(list) : 리스트에 특정 구분자를 포함해 문자열로 변환해준다.
문제의 접근법은 다음과 같다. 우선순위가 - >+ >* 라고 가정했을 때* 연산을 하기 위해서는 + 연산의 결괏값이 먼저 필요하다고 생각할 수 있다. 동일하게 + 연산을 하기 위해서는 - 연산의 결과값이 먼저 필요하다.
이런 이유로 인해 먼저 * 을 기준으로 수식을 쪼갠다. * 연산자는 우선순위가 가장 낮기 때문에 - , + 를 먼저 계산한 결괏값들을 가지고 마지막에 계산한다. 쪼개진 수식은 다시 같은 이유로 그다음 낮은 우선순위를 가지는 + 로 쪼갠다.
+ , * 로 쪼개진 수식들은 최종적으로 - 연산만 가진 수식이 되거나 그냥 숫자만 있는 수식이 되는데 이때 수식을 계산하고 값을 리턴한다. (그냥 숫자만 있는 수식은 그대로 리턴한다)
반응형
'알고리즘 문제풀기 > 프로그래머스' 카테고리의 다른 글
[2019 카카오 겨울 인턴십] 튜플 - Python (0) | 2020.09.11 |
---|---|
[2019 카카오 겨울 인턴십] 크레인 인형뽑기 게임 - Python (0) | 2020.09.11 |
[JavaScript] 프로그래머스 - 다리를 지나는 트럭 (0) | 2020.05.11 |
[JavaScript] 프로그래머스 - 모의고사 (0) | 2020.05.08 |
[JavaScript] 프로그래머스 - 위장 (0) | 2020.05.07 |