티스토리 뷰

문제 링크

 

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

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

programmers.co.kr


● 문제 설명

문제 설명은 위 링크를 참고해주세요 ( 너무 길어서... )

 

입출력 예시


● 문제 해결 방향 

먼저 덧셈, 뺄셈, 곱셈으로 이루어져 있기 때문에 itertools.permutaion 함수로 모든 조합을 찾아 해결해도 괜찮을 것이라 생각한다.

그리고 주어진 변수가 string으로 되어있어 각 연산에대해 split함수를 통해 연산이 가능한 최소 단위까지 쪼갠다.

문자열 내에 연산이 1개 남았을 때 eval() 함수를 통해 연산을 실시하고, split으로 만들어진 배열을 연산 우선순위에 따라 적절한 연산기호로 join 하여 string을 만들고, eval() 함수를 적용시켜 연산을 실시하는 것을 반복한다.

 


● 문제 해결 코드

 

eval() 함수를 모르고 이 문제를 처음 접했고 연산 우선순위에 따라 split을 했을 때 3중 배열 까지 생성되어서

연산을 실시할 때 무식하게 반복문이 엄청나게 나오게 되었다.....

 

이후 eval()이라는 아주 간편한 함수를 발견했고 다음과 같은 답을 작성했다.

import itertools 

def solution(expression):
    
    arr = ['-', '+', '*']
    cal_arr = itertools.permutations(arr, 3)
    
    result = []
    
    for cal in list(cal_arr):
        ex1 = expression.split(cal[2])
        ex = [ str(eval(cal[1].join([str(eval(i)) for i in ex1[e].split(cal[1])])))  for e in range(len(ex1))]
        result.append(abs(eval(cal[2].join(ex))))
    answer = max(result)
    return answer

eval()을 써도 for문을 이렇게 남발해도 되나 싶을 정도로 많이썼다.

 

우선순위의 역순으로 split 한 후 최소 연산이 등장하면 ()로 묶어주고

모든 연산으로 join 한 후에 한 번에 eval()을 적용시켜 주었다.

--> 최소 연산이 생길 때마다 eval()을 적용시킨 부분을 최소화시켜주는 코드인 것 같다.


● 알게 된 것 / 아쉬운 점

eval() 짱.

 

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