알고리즘/프로그래머스문제풀이

[Python/프로그래머스]다시풀어보는_수식최대화_[구현,permutation,re.split]

개발자 덕구🐾 2023. 10. 29. 19:01
728x90

 

 

문제링크 : 

https://school.programmers.co.kr/learn/courses/30/lessons/67257?language=python3

 

프로그래머스

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

programmers.co.kr

 

 

 


 

 

 

1년전에 이 문제를 풀었던 블로그에 기록이 있다.

하지만 나는 전혀 기억이 나지않았고 

문제를 보고 구현...? 이런 생각까지만 나왔다. 

 

 

 

이 문제를 풀기위해 permutation 을 배웠고 re.split()도 배웠다. 

많이 배워가는 문제다. 

 

permutation 포스팅 : 

https://what-am-i.tistory.com/453

 

[Python]Permutation을 아십니까?

알았는데요 , 1년동안 안쓰니까 잊어먹었습니다. 이래서 기록이 중요합니다. Permutation은 파이썬에서 제공해주는 함수이다. (itertools에 있음) 순열이라는 뜻으로 학교다닐 때 배우던 순열과 동일

what-am-i.tistory.com

 

 

 


 

 

 

 

코드 : 

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

 

[Python/프로그래머스]수식최대화_[구현]

https://school.programmers.co.kr/learn/courses/30/lessons/67257 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는

what-am-i.tistory.com

 

 

참고 블로그 : 

https://americanoisice.tistory.com/170

 

[프로그래머스] 수식 최대화, python

https://school.programmers.co.kr/learn/courses/30/lessons/67257 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는

americanoisice.tistory.com

 

반응형