문제링크 :
https://school.programmers.co.kr/learn/courses/30/lessons/67257?language=python3
1년전에 이 문제를 풀었던 블로그에 기록이 있다.
하지만 나는 전혀 기억이 나지않았고
문제를 보고 구현...? 이런 생각까지만 나왔다.
이 문제를 풀기위해 permutation 을 배웠고 re.split()도 배웠다.
많이 배워가는 문제다.
permutation 포스팅 :
https://what-am-i.tistory.com/453
코드 :
from itertools import permutations as per
import re
def operate(e,a,b) :
if e == '+' : return a+b
elif e == '-' : return a-b
else : return a*b
def solution(expression):
result = []
op_lists = list(per(['+','-','*'],3))
expression = re.split("([^0-9])",expression) # 0~9까지의 숫자를 제외 -> 문자를 구분자로
for op_list in op_lists :
exp = expression
for op in op_list :
s = []
for e in exp :
if s and s[-1] ==op :
s.pop()
s[-1] = operate(op,int(s[-1]),int(e))
else : s.append(e)
exp = s
result.append(abs(exp[0]))
return max(result)
설명 :
1) permuation을 이용하여 연산자의 우선순위 리스트를 만들어준다.
2) re.split()을 이용하여 주어진 expression의 리스트를 만들어준다.
3) 만들어진 우선순위 리스트들을 돌면서
3-1) 해당 우선순위대로 연산자들을 돌면서 ( ex) + , - , * )
3-2) 2에서 만든 값들을 돌면서 (s라는 tmp 리스트를 만들어 계산 값들을 저장, 3-1의 연산자가 끝나면 다시 exp에 저장)
3-3) 연산해준다.
4) result 리스트에 저장해준다. (절댓값으로)
5) 가장 큰 값을 return 해준다.
내가 이 문제를 풀면서 헤맸었는데
그 이유는 re.split() 때문이었다.
re.split()은
re.split( 정규표현식, 리스트) 가 들어가서
해당 리스트를 정규표현식(구분자)으로 쪼개준다. (반환값도 리스트)
그런데!
정규표현식에 "()" 이런 식으로 괄호가 들어가면 해당 구분자까지 포함되어 쪼개지고
괄호가 안들어가면 구분자는 무시하여 쪼개진다.
예시를 보자.
11123,2324,5234,2342
이런 문자를 , 를 구분자로 구분한다고 하면
expression = re.split(",",expression)
이렇게 구분하면
['11123', '2324', '5234', '2342']
이렇게 숫자만 구분이 된다.(구분자 무시)
하지만 정규표현식에 구분자를 괄호로 감싸주면
expression = re.split("(,)",expression)
['11123', ',', '2324', ',', '5234', ',', '2342']
이렇게 구분자인 (,)도 함께 리스트에 원소로 들어가있는것을 확인할 수 있다.
내가 이전에 풀었던 후기 :
https://what-am-i.tistory.com/414
참고 블로그 :
https://americanoisice.tistory.com/170
'알고리즘 > 프로그래머스문제풀이' 카테고리의 다른 글
[Python/프로그래머스]점 찍기_구현 (0) | 2022.12.05 |
---|---|
[Python/프로그래머스]파일명 정렬_구현 (0) | 2022.10.20 |
[Python/프로그래머스]n진수게임_구현 (0) | 2022.10.20 |
[Python/프로그래머스]압축_구현 (0) | 2022.10.20 |
[Python/프로그래머스]방금그곡_구현 (0) | 2022.10.19 |