본문 바로가기
TIL - 프로그래밍/Python 알고리즘

[프로그래머스] Lv.2 수식 최대화 - Python

by chaemj97 2022. 6. 2.
728x90

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

 

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

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

programmers.co.kr


  • 코드
from itertools import permutations

# 현 우선순위에 따라 연산하기
def money(prior,oper,num):
    for p in prior:
        while p in oper:
            i = oper.index(p)
            num[i] = str(eval(num[i] + p + num[i + 1]))
            num.pop(i + 1)
            oper.pop(i)
    return num[0]

def solution(expression):
    # 계산할려면 리스트여야 할듯
    num = []
    oper = []
    start = 0
    for idx, i in enumerate(expression):
        if i in ['+', '*', '-']:
            # 피연산자
            num += [expression[start:idx]]
            # 연산자
            oper += [i]
            start = idx + 1
    # 마지막 남은 피연산자
    num += [expression[start:]]
    
    # 중복 삭제
    oper1 = list(set(oper))

    max_money = 0

    # 우선순위
    for prior in list(permutations(oper1,len(oper1))):
        numbers = num.copy()
        operator = oper.copy()
        
        # 연산
        result = money(prior,operator,numbers)
        
        # 최대값인지 확인
        if max_money < abs(int(result)):
            max_money = abs(int(result))
            
    return max_money

  • 풀면서 도움 된 코드
    • 얕은 복사 / 깊은 복사
      • 수업을 들을 때는 잘 와닿지 않았는데 내가 필요한 부분에 딱 쓰니깐 이해됨
      • 얕은 복사(대입연산자(=), 슬라이싱([:]))
        • 원본도 변함
      • 깊은 복사(.copy())
        • 원본은 그대로 
    • eval()
      • 사칙연산 관련 문제에서 연산자가 여러개 나올 경우 하나하나 if문 작성했었는데... 알게 되서 행복한 함수
      • 문자열이나 표현식, 변수들을 입력으로 받아 이를 계산하고 반환해주는 함수
      • eval(3 + '+' + 5) -> 8로 반환
    • from itertools import permutations
      • 역시나 배웠을 때는 못써먹더니 내가 딱 필요한 상황에서는 머리에 쏙쏙 들어온다. 문제를 많이 풀어야겠다.
      • list(permutations(리스트, n)) :  리스트에서 n개씩 뽑는 경우의 수 모두 
728x90
반응형

댓글