본문 바로가기

알고리즘

프로그래머스)수식 최대화-pyhton

https://school.programmers.co.kr/learn/courses/30/lessons/67257

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제를 이해하기엔 쉬웠지만 이를 구현하는데 애를 먹었다.

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)값을 리턴해주면 된다.