https://programmers.co.kr/learn/courses/30/lessons/67257/
코딩테스트 연습 - 수식 최대화
IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과
programmers.co.kr
내 풀이:
from itertools import permutations
# 수식을 해당 연산자에 대해 연산한 후의 수식 리턴
def calculate(operator, expression):
new_exp = []
i = 0
while i < len(expression):
if expression[i] == operator:
new_exp.append(str(eval(new_exp.pop() + expression[i] + expression[i + 1])))
i += 2
else:
new_exp.append(expression[i])
i += 1
return new_exp
def solution(expression):
# 수식을 연산자 기준으로 나누고, 연산자들 저장
stack, operator = [] * 100, []
for char in expression:
if char.isdigit():
if stack and stack[-1].isdigit():
stack[-1] += char
else:
stack.append(char)
else:
stack.append(char)
if char in operator:
continue
operator.append(char)
# 연산자 우선순위의 모든 조합에 대한 최종 계산값 갱신하며 최댓값 추출
result = 0
for rank in permutations(operator, len(operator)):
exp = stack[:]
for r in rank:
stack = calculate(r, stack)
result = max(result, abs(int(stack[0])))
stack = exp
return result
- 아이디어:모든 우선순위 조합에 대해 완전탐색으로 계산 후 그중 최댓값을 정답으로 반환
- 아이디어보다는 우선순위에 맞게 연산하는 과정을 구현하는데 매우 오랜 시간이 걸렸음
- for문으로 수식 돌면서 필요시 계산 후 빈 리스트에 차곡차곡 append 했으면 되는 것을 수식 자체를 바꾸면서 반복문을 돌다보니 오래 걸림 (실수)
- eval() -> int 라서 str으로 다시 변환 필요
참고 풀이:
from itertools import permutations
def solution(expression):
answer = []
for op in permutations(('+', '-', '*'), 3):
third, second = op[0], op[1]
temp_list = []
# 역순으로 올라가면서 괄호 처리
for e in expression.split(third):
temp = [f'({i})' for i in e.split(second)]
temp_list.append(f'({second.join(temp)})')
answer.append(abs(eval(third.join(temp_list))))
return max(answer)
- 역발상으로 풀이한 기발한 아이디어, 연산자 갯수가 무엇이든 해당하는 풀이
- 괄호 처리를 하는 접근으로 풀이했고, 최종적으로 한번 eval()하면 결과가 나오게끔 되어 매우 깔끔함
'CS > algorithm & data structure' 카테고리의 다른 글
[프로그래머스] 순위 검색 (파이썬 풀이) (0) | 2022.06.29 |
---|---|
[프로그래머스] 튜플 (파이썬 풀이) (0) | 2022.06.27 |
[프로그래머스] 거리두기 확인하기 (파이썬 풀이) (0) | 2022.06.26 |
[프로그래머스] [1차] 뉴스 클러스터링 (파이썬 풀이) (0) | 2022.06.25 |
[프로그래머스] 괄호변환 (파이썬 풀이) (0) | 2022.06.25 |