https://school.programmers.co.kr/learn/courses/30/lessons/67257
문제를 이해하기엔 쉬웠지만 이를 구현하는데 애를 먹었다.
def solution(expression):
answer = 0
m = 0
arr = ['*','-','+']
for i in range(0,3):
calculate = arr[i]
summ = []
arr2 = ['*','-','+']
arr3 = ['*','-','+']
arr2.remove(calculate)
arr3.remove(calculate)
arr3.reverse()
a = expression.split(calculate)
for j in range(len(a)):
if '-' not in a[j] and '+' not in a[j] and '*' not in a[j]:
summ.append(int(a[j]))
else:
summ2 = []
a2 = a[j].split(arr2[i])
for k in range(len(a2)):
if '-' not in a2[k] and '+' not in a2[k] and '*' not in a2[k]:
return answer
처음 구현한 코드다.
하나하나씩 for문을 돌려 split()으로 나누고 이를 해결하려 했지만 너무나 코드가 길었다.
- +. *를 로테이션으로 돌리는 것은 permutations로 하더라도 for문을 3개나 쓰는 것이 마음에 걸렸다.
비록 제한시간 안엔 간신히 들겠지만 무언가 잘못됐다고 생각했다.
그래서 검색해보았다.
import re
from itertools import permutations
def solution(expression):
answer = []
expression = re.split('([-*+])',expression)
cal = list(permutations(['-','+','*'],3))
for i in cal:
exp = expression[:]
for j in i:
while j in exp:
idx = exp.index(j)
result = str(eval(exp[idx-1] + exp[idx] + exp[idx+1]))
exp[idx - 1] = result
del exp[idx:idx+2]
answer.append(abs(int(result)))
return max(answer)
훨씬 간단하고 이해하기 쉬운 코드이다.
우선 정규표현식을 사용해 split을 해주었다.
expresstion을 print로 나타내자면,
['50', '*', '6', '-', '3', '*', '2'] |
로 나타난다.
그리고 수식을 permutations로 조합을 짜주어 for문을 돌린다.
첫번째 for문은 + - * 조합을 짠 순서대로 for문을 돈다.
두번째 for문은 이를 하나씩 확인한다.
예를들어 두번째 for문이 -라면,
while문을 통해 -가 미리 expression을 복사해둔 exp에 있다면 그 idx-1 ,idx, idx-2를 계산해준다.
계산식은 eval을 통해 간단하게 구현했다.(ex: eval('2' '*' '4') 은 8이 나온다.)
그리고 첫번째 For문에서 -, +, * 계산이 모두 끝이 났다면 result에 넣고
첫번째 포문도 모두 끝이 났다면 max(result)값을 리턴해주면 된다.
'알고리즘' 카테고리의 다른 글
*프로그래머스)뒤에 있는 큰 수 찾기-python (0) | 2023.02.04 |
---|---|
프로그래머스)두 큐 합 같게 만들기-pyhton (0) | 2023.02.02 |
프로그래머스) 메뉴 리뉴얼-python (0) | 2023.01.30 |
백준) 거스름돈-python (0) | 2023.01.30 |
백준) 잃어버린 괄호-python (0) | 2023.01.30 |