-
[프로그래머스] 수식 최대화알고리즘 2023. 7. 21. 11:29728x90
1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/67257
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2. 접근
개인적으로 어려웠다,,,,1. expression에서 수식을 받아와서, st에 없는 연산자면, st에 넣어준다
2. st에 있는 연산자들에 permutation(순열)을 통해서 나올 수 있는 우선순위들을 전부 구한다
3. expressions 라는 새로운 배열에 숫자들은 묶고 ( ex - 1 0 0 은 100으로 묶어서 ) , 연산자는 연산자로 해서 배열에 넣어준다
4. 피연산자들을 for문으로 가져오면서, expressions은 queue에 넣어놓고, queue에서 하나씩 데이터를 뽑되 그게 연산자면 cal method를 실행시킨다
내가 생각하기에 간단하면서도 떠올리기 힘들었던 점은,
expressions = tk
이 부분이다.
예를들면, 100 - 200 이 cal 메소드를 호출해서 -100이라는 결과가 만들어져 tk에 들어있다면 이를 바탕으로 expressions를 새롭게 구성을 해야한다!!! 아니면 expressions은 -100이 만들어졌음에도 불구하고 100 - 200 이런식으로 데이터가 들어있을것이기 때문이다.
[ 배열을 치환해줘야 한다 ]
로직 자체는 떠올리기 쉽지만, 어떻게 구현해야할지에 대해서 고민하는데 시간이 좀 걸렸다..
3. 풀이
from itertools import permutations as pm from collections import deque def cal(a,b,oper): if oper == '-': return a - b elif oper == '*': return a * b elif oper == '+': return a + b def solution(expression): st = [] for e in expression: if (e in ['-', '*', '+']) and e not in st: st.append(e) # 우선순위 나오는 경우의 수 express = list(pm(st,len(st))) ans = 0 for i in express: expressions = [] val = '' for ex in expression: if ex not in ['-', '*', '+']: val += ex else: expressions.append(int(val)) expressions.append(ex) val = '' if val != '': expressions.append(int(val)) for op in i: print("op :", op) q = deque(expressions) print("q :", q) tk = [] while q: data = q.popleft() print("data :",data) if data == op: last = tk.pop() val = q.popleft() print("last {} oper {} op {}".format(last, val, op)) tk.append(cal(last,val,op)) else: tk.append(data) print("tk :", tk) expressions = tk res = abs(expressions[0]) print(res) ans = max(res,ans) return ans
'알고리즘' 카테고리의 다른 글
[알고리즘 팁] x=y 대칭되는 값들을 찾아보자! (2) 2024.03.06 [ 알고리즘 TIP ] 2차원 배열 회전 (0) 2024.02.20 [프로그래머스] 행렬의 곱셈 (0) 2023.07.18 [프로그래머스] 멀쩡한 사각형 (0) 2023.07.17 [프로그래머스] 이진 변환 반복하기 (0) 2023.07.17