티스토리 뷰

반응형
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
import itertools
def solution(expression):
    answer = 0
    start=0
    num,cal=[],[]
    for idx,c in enumerate(expression):
        if c in ['+','-','*']:
            cal.append(c)
            num.append(int(expression[start:idx]))
            start=idx+1
    num.append(int(expression[start:]))
    for orders in itertools.permutations(['+','-','*'],3):
        copyNum=num[:]
        copyCal=cal[:]
        while len(copyNum)>1:
            for ods in orders:
                while True:
                    try:
                        idxx=copyCal.index(ods)
                        if ods=='+':
                            copyNum[idxx]=copyNum[idxx]+copyNum[idxx+1]
                        elif ods=='-':
                            copyNum[idxx]=copyNum[idxx]-copyNum[idxx+1]
                        elif ods=='*':
                            copyNum[idxx]=copyNum[idxx]*copyNum[idxx+1
                        del copyNum[idxx+1]
                        copyCal.remove(ods)  
                    except:
                        break
        answer=max(answer,abs(copyNum[0]))                    
    return answer
cs

문제:programmers.co.kr/learn/courses/30/lessons/67257

 

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

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

programmers.co.kr

우선 숫자와 기호를 두 파트를 나눠야 한다. 그런 다음 +, -, * 의 모든 우선순위를 구해 절댓값이 최대가 되는 식을 구하면 된다. 

우선 숫자를 저장하는 리스트는 항상 기호를 저장하는 리스트보다 1이 더 크다.

이 원리를 이용하면 계산 할때에는 copyNum[idxx]=copyNum[idxx] [+,-,*] copyNum[idxx+1] 이런식의 꼴이 형성된다. 그리고 계산 결과를 마쳤으면 계산에 이용된 숫자와 기호는 없애햐 하므로 삭제한다.( 그래서 while문 사용)

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import re
from itertools import permutations
 
def solution(expression):
    #1
    op = [x for x in ['*','+','-'if x in expression]
    op = [list(y) for y in permutations(op)]
    ex = re.split(r'(\D)',expression)
    #2
    a = []
    for x in op:
        _ex = ex[:]
        for y in x:
            while y in _ex:
                tmp = _ex.index(y)
                _ex[tmp-1= str(eval(_ex[tmp-1]+_ex[tmp]+_ex[tmp+1]))
                _ex = _ex[:tmp]+_ex[tmp+2:]
        a.append(_ex[-1])
    #3
    return max(abs(int(x)) for x in a)
cs

여기에서는 위의 코드와 차이점은 데이터를 파싱하는 방법과 eval으로 수식을 계산한다는 점이다.

 

1
print(eval("3+5")) #8
cs

 

 

1
2
3
4
5
6
7
8
9
10
11
12
def solution3(expression):
    operations = [('+''-''*'),('+''*''-'),('-''+''*'),('-''*''+'),('*''+''-'),('*''-''+')]
    answer = []
    for op in operations:
        a = op[0]
        b = op[1]
        temp_list = []
        for e in expression.split(a):
            temp = [f"({i})" for i in e.split(b)]
            temp_list.append(f'({b.join(temp)})')
        answer.append(abs(eval(a.join(temp_list))))
    return max(answer)
cs

이 방법은 참신했던 것 같다.

위와 같이 하면 우선순위에 따라 괄호가 형성된다. 단 인덱스의 크기가 커질수록 우선순위가 높다.

예를 들어 ('+', '-', '*') 의 경우에는  ((100)-(200*300)-(500))+((20)) 와 같이 된다.

+가 우선순위가 가장 낮고 그 다음에는 - 마지막으로는 *가 우선순위가 가장 높다.

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함