DevKim

[Python] 2020 카카오 인턴 기출 - 수식 최대화 본문

알고리즘 PS

[Python] 2020 카카오 인턴 기출 - 수식 최대화

on_doing 2021. 2. 22. 16:50
728x90

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

 

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

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

programmers.co.kr

[ 알고리즘 ]

구현

 

[문제 접근]

1. 파이썬의 정규표현식을 이용하여 -,+,* 부호만 뽑아낸 후

2. permutations 순열을 이용하여 해당 연산자로 나타낼 수 있는 조합을 따로 리스트에 담아줌

3. 연산을 쉽게 하기 위해서 숫자로만 이루어진 num 리스트와 부호로만 이루어진 cul 리스트를 정규표현식 re를 이용하여 따로 담아줌

4. 우선순위 부호부터 하나씩 순회하며 계산을 해줌

5. 계산한 것들을 result 리스트에 넣어준 후 map을 이용하여 전체에 절대값을 씌우고 그 중에서의 최대값 도출

 

[코드]

import re
from itertools import permutations

def solution(expression):
    answer = 0
    result=[] #전체 담기
    
    # 연산자만 뽑기
    p=re.compile('[^0-9]')
    cul=p.findall(expression)
        
    # 우선순위 조합을 구하기 위해 중복제거
    permu=list(set(cul))
        
    #연산자의 우선순위 조합
    permutation=list(permutations(permu,len(permu)))
    
    print(permutation)
    
    for data in permutation:
        
        # 숫자만 뽑아서 담아두기
        p=re.compile('[0-9]+')
        num=p.findall(expression)
        
        # 연산자만 뽑기
        p=re.compile('[^0-9]')
        cul=p.findall(expression)
        
        for i in range(len(data)):
            culc = data[i] # 우선순위 부호부터 하나씩 꺼내기           
            
            # 몇번째 부호인지 확인하기
            j=0
            while True:              
                if j==len(cul) or len(cul)==0:
                    break
                    
                if cul[j]==culc:
                    
                    if culc=='+':
                        ptr=int(num[j])+int(num[j+1])
                
                    if culc=='-':
                        ptr=int(num[j])-int(num[j+1])
                        
                    if culc=='*':
                        ptr=int(num[j])*int(num[j+1])
                        
                    num.pop(j+1)
                    cul.pop(j)
                    num[j]=ptr
                    
                    j=-1
                    
                j+=1
                
        result.append(num[0])
                                            
    answer=max(map(abs,result))         
    
    return answer
728x90
Comments