본문 바로가기
공부-코딩테스트/코테풀이 - 자바, 파이썬

수식 최대화 (코딩테스트, 프로그래머스)

by 령과 2022. 2. 7.

문제

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

 

코딩테스트 연습 - 수식 최대화

IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과

programmers.co.kr

나의 코드

from itertools import permutations
def solution(expression):
    answer=0
    
    tmp = list(permutations(['+','-','*'],3))
    expression=[expression]
    expression=change(expression,'+')
    expression=change(expression,'-')
    expression=change(expression,'*')
    
    for tmpp in tmp:#tmpp=['+','-','*']
        target=expression.copy() #target=>expression저장
        for pmp in tmpp: # 우선순위대로 불러오기 pmp= +
            for index in range(len(target)):#우선순위대로 기호접근
                if target[index]==pmp: # 우선순위 기호 만나면
                    target[index+1]=calc(int(target[index-1]),int(target[index+1]),pmp)#계산 a + b 값을 b에 대입
            for index in range(len(target)):# 모두 계산된 후 a와 기호를 제거해야 다음 우선순위 기호를 계산가능
                if target[index]==pmp: # a와 기호를 x처리한다.
                    target[index-1]='x'
                    target[index]='x'
            target=list(filter(lambda x : x!='x',target))#x처리된 것을 배제하고 나머지를 pmp에 넣고 다음 기호로 넘어감
            
        answer=max(answer,abs(target[0]))#절대값이 가장 큰 값을 답으로 선택하기 위함.
        
    return answer

def change(expression,pmp): #문자열에서 숫자와 기호로 분리하기 위한 함수
    tmpp=[]
    for i in expression:
        if pmp in i:
            for j in i.split(pmp):
                tmpp.append(j)
                tmpp.append(pmp)
            tmpp=tmpp[:-1]
        else:
            tmpp.append(i)
    return tmpp
    
def calc(a,b,pmp): 문자로 되어있는 기호로 연산을 하기위한 함수
    if pmp=='+':
        return a+b
    elif pmp=='-':
        return a-b
    else:
        return a*b

풀이

단순한 구현문제였다. permutation으로 우선순위전체의 경우의 수를 저장한 후 차례차례 값을 뽑은 후 가장 큰 값을 선택하는 식으로 문제를 해결하였다.

 

예를 들어 a+b 수식이 있고 +기호를 처리할 때 a+b에서 b위치에 a+b값을 넣은 후 a와 +를 리스트에서 제거하는 식으로 계산을 처리하였다.

 

 

 

-----------------------------------------------------------------------------------------------------------------------------------

검색해서 처리한 부분

1.filter함수

filter(함수, 적용할 리스트)-> 리스트 요소를 하나씩 선택해서,

함수의 결과 true로 하는 리스트 요소만 골라 저장한다.

결과값은 filter 객체이기 때문에 list()로 묶어서 표현하게 될 것이다.

 

댓글