본문 바로가기

Problem Solving/programmers

[Programmers] 수식 최대화(Python) / 2020 카카오 인턴십

 

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

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

programmers.co.kr

2020 카카오 인턴십 기출문제이다. Level2 인데 생각보다 까다로웠다.

  • 사용 알고리즘 : 순열, 구현
  • 처음 참고한 코드는  아래 링크로 남겨둔다.
  • 저 분의 코드 흐름은 같으나, 난 permutation 라이브러리로 순열을 구현해 반복문으로 가장 순위가 높은 순으로 계산했다.
  • 계산 시에는 eval 함수로 나온 정수를 다시 문자열로 바꾸며 계속 계산을 진행했다.

grapetown.tistory.com/63

 

파이썬 코드는 다음과 같다.


from itertools import permutations

def calc(expression, priority):
    for i in range(len(expression)):
        expression[i] = expression[i].split(priority[1])
    new_expression = []
    for i in range(len(expression)):
        temp = []
        for e in range(len(expression[i])):
            if priority[0] in expression[i][e]:		# 우선순위 가장 높은 기준
                temp.append(str(eval(expression[i][e])))
                continue
            temp.append(expression[i][e])
        new_expression.append(temp)

    expression = []
    for i in range(len(new_expression)):
        if len(new_expression[i]) > 1:
            expression.append(str(eval(priority[1].join(new_expression[i]))))
            continue
        expression.append(new_expression[i][0])		# 우선순이 두번째로 높은 기준
    return abs(eval(priority[-1].join(expression)))	# 절댓값을 리턴

def solution(expression):
    answer = 0
    for priority in permutations("+-*", 3):
        new_expression = expression.split(priority[-1])		# 가장 우선순위 낮은 연산자 기준
        answer = max(answer, calc(new_expression, priority))
    return answer

print(solution("100-200*300-500+20"))
print(solution("50*6-3*2"))

  • 고찰 : 수식을 일일이 구현하기 힘들어서 그냥 냅다 eval 함수를 사용해서 계산했다. 시간 초과가 나지 않아 신기했다.