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

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

개발자 덕구🐾 2022. 10. 2. 21:44
728x90

 

 

 

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

 

프로그래머스

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

programmers.co.kr

 

 

🐾 20221021

 

 

 

 

 

뭔가 stack 2개를 이용하고 combination or permutation을 쓸것같다. 

예상은 했으나 구현에 실패...😓

 

다음에 이 문제를 풀때는 꼭 구현에 성공했으면 좋겠다. 

 

 

 


✌2022-10-21

 

다음에 이 문제를 풀어봤는데 못풀었다...ㅎㅎ

이번에도 permutations를 이용하고 deque 2개를 이용해서 연산할 것같았다.

좀 더럽게라도 expressions를 숫자와 기호대로 구분하였고 

구분한 것들을 deque 에 넣어가며 했는데 .. 연산자까지 str형태이니까 

여기서 뭔가를 써서 string 형태인 수식도 계산하는 방법이 있었는데 잊어먹었다 ㅎㅎ

 

-> eval 이였다!!!

 

 

근데 이 문제가 deque을 2개 쓴다기보다는 하나의 덱에 숫자와 문자를 다 넣은 다음에

3개의 연산자를 돌면서 각 연산을 수행하게 만드는 문제다. 

 

 


 

 

 

 

 

 

 

 

combinations 같은 경우 순서가 의미가 없을 때고 

이 문제는 순서가 의미가 있다. 그러므로 permutations를 써야한다. 

 

 

 

여기서 주는 expression은 그냥 split으로 나누면 안되고 

이렇게 for문을 돌려서 숫자들은 차곡 차곡 모아 하나의 숫자 덩어리로 만들고 

연산자가 나오면 그것도 넣는다. 

 

 

 

이제 permutaion을 통해서 나온 연산자 숫서대로 stack을 이용해서 답을 구한다. 

연산자 우선순위대로 돌면서 우선순위가 높은 것 부터 연산한다. 

만약 연산자가 아니면 stack에 넣고 연산자라면 stack에 넣은 수와 아직 덱에 있는 수를 빼서 연산한다. 

연산하는 방법은 eval이다. 

 

 

 

eval을 쓰면 str형태의 문자열을 연산해준다. 

모든 연산자를 돌고나면 남은 수를 return 한다.

 

 

 

코드 : 

from itertools import permutations as perm
from collections import deque

def solution(expression):
    answer = 0
    for priority in list(perm(['+','-','*'],3)) :
        answer = max(answer, abs(make_result(priority, expression)))
    return answer

def make_result(priority, expression) :
    arr= deque()
    num = ''
    
    # 연산자와 숫자 구분 
    for k in expression :
        # 한 글자씩 숫자를 모은다.
        if k.isdigit() : num += k 
        # 기호가 나오면 지금까지 나온 숫자를 붙인다. 
        else :
            arr.append(num)
            num = ''
            arr.append(k)
    arr.append(num)
    
    # 연산기호의 우선순위대로 
    for op in priority :
        stack = []
        # arr의 모든 값이 stack으로 옮겨갈 때까지 
        while len(arr) != 0 :
            temp = arr.popleft()
            # 연산자라면 
            if temp == op :
                # 방금 stack에 들어간 값과 arr의 값을 eval을 통해 연산 
                result = str(eval(stack.pop() + op + arr.popleft()))
                stack.append(result)
            else :
                stack.append(temp)
        arr = deque(stack)
    return int(arr[0])

 

 

 


 

 

나는 아주 더럽게 숫자와 연산자를 구분했는데 😈 여기서는 아주 우아하게 구분했다. 

숫자일 경우 num에 붙이고 숫자가 아니면 (연산자라면) 지금까지 모아왔던 num을 arr에 붙이고 연산자도 붙인다. 

 

 

    for k in expression :
        if k.isdigit() : num+=k
        else : 
            arr.append(num)
            num=''
            arr.append(k)
    arr.append(num)

 

 

 

 

 

permutations을 통해 구한 연산자 우선순위에서 

그 우선순위대로 for문을 돌린다. 

숫자와 연산자가 들어있는 arr에서 해당 우선순위의 연산자를 확인한다. 

해당 연산자가 있으면 eval을 이용해서 계산한 후 result를 다시 stack에 넣는다.

 

3개의 연산자 계산이 끝나면 arr에는 숫자 하나만 들어있을 텐데 이것을 [0]으로 불러서 int로 바꿔서 반환한다.

 

    for op in priority : 
        stack = []
        while len(arr) != 0 :
            temp = arr.popleft()
            if temp == op :
                result = str(eval(stack.pop() + op + arr.popleft()))
                stack.append(result)
            else : 
                stack.append(temp)
        arr = deque(stack)
    return int(arr[0])

 

 

 

 

 

 

 

참고 블로그 : 

https://2hs-rti.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv2-%EC%88%98%EC%8B%9D-%EC%B5%9C%EB%8C%80%ED%99%94-%ED%8C%8C%EC%9D%B4%EC%8D%AC

 

[프로그래머스] Lv2 - 수식 최대화 (파이썬)

https://programmers.co.kr/learn/courses/30/lessons/67257 코딩테스트 연습 - 수식 최대화 IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이.

2hs-rti.tistory.com

 

반응형