[Programmers] 수식 최대화

김가영·2021년 2월 10일
0

Algorithm

목록 보기
45/78
post-custom-banner

문제 바로가기

+,-,* 의 연산기호만으로 이루어진 연산수식(expression) 에서 연산기호의 우선순위를 재정의하여 얻을 수 있는 최댓값을 구하는 문제

input 조작하기

    nums = expression.replace('-', '*')
    nums = nums.replace('+', '*')
    nums = nums.split('*')
    nums = list(map(int, nums))
    ex = [i for i in expression if i in '+*-']

nums 는 숫자들 배열,
ex 는 연산기호들의 배열

만약 expression = "100-200*300-500+20" 로 주어졌다면 nums 는 [100,200,350,500,20], ex 는 ['-','*','-','+']

number 함수 : 단순 계산 함수

def number(a,b,ex):
    if ex=='*':
        return a*b
    if ex == '-':
        return a - b
    return a + b

단순히 a, b (숫자) 값과, 연산기호 ex 를 전달받아 연산한 값을 return 한다.

compute 함수 : 우선순위 e 를 이용하여 연산한 값을 return

   def compute(e, ex):
    newnum = nums.copy()
    newex = ex.copy()
    
    for ex in e:
        j = 0
        while j < len(newex):
            if newex[j] == ex:
                del newex[j]
                newnum[j] = number(newnum[j], newnum[j+1], ex)
                del newnum[j+1]
            else:
                j+=1
    return newnum[0]

우선순위 e 를 이용하여 연산한 값을 return 한다.

라스트 팡

for e in list(permutations(['+','*','-'], 3)):
    answer = max(answer, abs(compute(e, ex)))
    

permutations 은 가능한 연산기호들의 우선순의 배열들을 모두 가져오기 위한 순열 라이브러리.

Others

def solution(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)]
            print(temp)
            temp_list.append(f'({b.join(temp)})')
        answer.append(abs(eval(a.join(temp_list))))
    return max(answer)

우선순위에 있는 것들을 () 로 묶어 먼저 계산하게 했다 ㄷㄷ

eval 함수

expression 인자에 string 값을 넣으면 해당 값을 그대로 실행하여 출력해준다.

eval('123 * 1')

f-string

python 3.6 부터 제공하는 string format
중괄호를 이용하여 바로 format 할 수 있다

name = 'Gayoung'
print(f'Hi my name is {name}')

f 접두사를 통해 바로 이용 가능하다

profile
개발블로그
post-custom-banner

0개의 댓글