티스토리 뷰

728x90

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

 

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

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

programmers.co.kr

 

  • 해설 : 

어떤 수식이 주어질 때 이 수식을 더하기, 빼기, 곱하기의 우선순위를 다르게 하여 계산하고 이 때의 최댓값을 구하는 문제이다.

 

 

 

 

  • 풀이 :

먼저 permutaions()를 이용해 +, -, * 연산자의 모든 우선순위 조합을 만들어놓고 각 우선순위마다 수식을 다르게 계산하면서 최댓값을 찾는 시도를 하였다. 우선순위를 표현할 수 있는 가장 좋은 방법이 우선순위마다 괄호로 묶어서 eval로 한 번에 계산하는 방법이라고 생각하여  queue에 숫자와 연산기호를 나누어서 담은 후 우선순위에 따라 queue에서 pop을 해주며 괄호로 묶어 문자열을 만들었다. 최종적으로 나온 문자열을 eval 연산하여 최댓값을 갱신하며 답을 도출하였다.

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import re,copy
from collections import deque
from itertools import permutations
 
 
def cal(exp):
    m = -1
    for e in permutations(['+','-','*'],3):
        queue = deque(exp)
        for i in range(3):
            a = len(queue)
            while a > 0:
                c = queue.popleft()
                if c == e[i]:
                    queue.append('('+queue.pop() + c + queue.popleft()+')')
                    a -= 1
                else:
                    queue.append(c)
                a -= 1
        m = max(abs(eval(''.join(queue))),m)
    return m
    
def solution(expression):
    answer = 0
    queue = []
    exp = []
    e = re.split('[+*-]',expression)
    for i in expression:
        if not i.isdigit():
            queue.append(i)
    for i in range(len(queue)):
        exp.append(e[i])
        exp.append(queue[i])
    exp.append(e[-1])
    return cal(exp)
cs
320x100
댓글
© 2022 WonSeok, All rights reserved