- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/67257
Lv2 문제다!
문제 이해
최대 3개의 연산자(*, +, -)의 우선순위를 매겨서 계산한 결과 중 절댓값의 최대를 구하는 문제다
연산자의 개수가 몇개 안되므로 이는 permutations을 통해 정하면 된다고 생각했다
문제는 우선순위에 따라 식을 계산하는 건데, 여기에서 막혔었다
각 순열에 대해서 우선순위에 따른 값을 abs로 절댓값으로 바꾼다음 그 중 최댓값을 반환하면 된다
풀이 이해
- expression에서 숫자와 연산자를 따로 분리하기 위해 li 스택을 이용한다 ('100', '+', '200)
- 3개의 연산자 중 식에 없는 연산자는 제거한다
- permutations 함수를 이용해 임의의 연산자 우선순위를 구한다
- 우선순위에 맞춰서 식을 계산한다(여기가 가장 어렵다)
- 계산한 결과를 abs로 절댓값으로 바꿔준다
- answer와 result 중 최댓값을 누적한 후 반복문이 끝나면 해당 answer를 반환한다
- 정답 풀이 :
from itertools import permutations
from collections import deque
def solution(expression):
answer = 0
ops = ["*", "+", "-"]
# 스택 생성
li = []
s = 0
for i, v in enumerate(expression):
if v in ["*", "+", "-"]:
li.append(expression[s:i])
li.append(v)
s = i + 1
else:
li.append(expression[s:])
# expression에 없는 연산자는 ops에서 제거
for op in ops:
if op not in expression:
ops.remove(op)
# ops에 있는 연산자로 구성할 수 있는 모든 우선순위 생성
primarity = permutations(ops)
for case in primarity: # 최대 6가지의 연산자 우선순위 조합
stacks = [deque(li), deque()]
t1 = 1
for c in case: # 각 경우에서 연산자 처리
t1 = (t1+1) % 2 # 스택 토글 변수
t2 = (t1+1) % 2
while len(stacks[t1]):
item = stacks[t1].popleft()
if len(stacks[t2]) and stacks[t2][-1] == c:
c = stacks[t2].pop()
n = stacks[t2].pop()
item = str(eval(str(n)+c+str(item)))
stacks[t2].append(item)
result = stacks[len(ops)%2].pop()
result = abs(int(result))
answer = max(answer, result)
return answer
'코딩테스트 > 기출' 카테고리의 다른 글
[Summer/Winter Coding(~2018) / 프로그래머스] 12978번 : 배달 (0) | 2022.10.22 |
---|---|
[2021 Dev-Matching: 웹 백엔드 개발자(상반기) / 프로그래머스] 77485번 : 행렬 테두리 회전하기 (0) | 2022.10.21 |
[연습 문제 / 프로그래머스] 12936번 : 줄 서는 방법 (0) | 2022.10.20 |
[2018 KAKAO BLIND RECRUITMENT / 프로그래머스] 17683번 : [3차] 방금 그 곡 (0) | 2022.10.20 |
[월간 코드 챌린지 1 / 프로그래머스] 68936번 : 쿼드압축 후 개수 (1) | 2022.10.11 |