본문 바로가기

PS/프로그래머스

[프로그래머스 LV 2 ] 수식 최대화 파이썬/python

728x90

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

 

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

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

programmers.co.kr

파이썬으로 푸는거 익히기 너무 잘 했다고 생각되는 문제..

문자열다룰떄 압도적으로 쉬웠다.

 

수와 연산자로 나눠준 후에

모든 경우의수를 순열로 구해서 

모든 경우마다 나오는 수식의 값중 max를 찾아줬다.

 

 

 

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# 숫자와 문자로 분리
# 분리해서 따로따로 list에 저장
# 모든 경우에수에 맞게 순열을 짜서 계산, max값 도출
 
visit = [0 for i in range(3)]
formula = ["+""-""*"]
priority = []
 
 
# 계산하는 함수
def calculator(a, b, p):
    if p == "+":
        return a + b
    elif p == "-":
        return a - b
    else:
        return a * b
 
 
def dfs(idx, temp):
    global visit, priority
 
    if idx == 3:
        priority.append(temp[:])
        return
 
    for i in range(3):
        if visit[i] == 1:
            continue
        visit[i] = 1
        temp.append(formula[i])
        dfs(idx + 1, temp)
        temp.pop()
        visit[i] = 0
 
 
def solution(expression):
    answer = 0
    formula_list = []
    num_list = []
    slice_idx = 0
 
    # 문자와 숫자를 분리합니다
    for i in range(len(expression)):
        if expression[i] in formula:
            formula_list.append(expression[i])
            num_list.append(int(expression[slice_idx:i]))
            slice_idx = i + 1
        # 마지막 숫자는 위의 if문으로 걸러낼 수 없어
 
    num_list.append(int(expression[slice_idx:]))
 
    # 순열로 연산자의 우선순위를 결정, 모두 더해서 abs(max) 값을 도출하자
    dfs(0, [])
   
    for prior in priority:
        temp_formula = formula_list[:]
        temp_num = num_list[:]
        for p in prior:
            i = 0
            while (i < len(temp_formula)):
                if p == temp_formula[i]:
                    num1 = temp_num[i]
                    num2 = temp_num.pop(i + 1)
                    temp_num[i] = calculator(num1, num2, p)
                    temp_formula.pop(i)
                    i -= 1
                i += 1
        if abs(temp_num[0]) > answer:
            answer = abs(temp_num[0])
 
    return answer
 
cs
728x90