문제

문제

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

 

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

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

programmers.co.kr

 

처음 작성한 코드

def solution(expression):
    from itertools import permutations
    import re
    maxNum = -1
    number = list(map(int, re.findall('\d+', expression)))
    operator = re.findall('[-*+]', expression)
    priority = permutations(set(operator),len(set(operator)))

    for i in priority:
        number_ = list(map(int, re.findall('\d+', expression)))
        operator_ = re.findall('[-*+]', expression)
        for now in i:
            j = 0
            while True:
                if j == len(operator_): break
                if now == operator_[j]:
                    if now == '-':
                        tmp += number_[j] - number_[j+1]
                    elif now == '+':
                        tmp += number_[j] + number_[j+1]
                    else:
                        tmp += number_[j] * number_[j+1]
                    number_.pop(j+1)
                    number_.pop(j)
                    number_.insert(j,tmp)
                    operator_.pop(j)
                else: j+=1
        maxNum = max(maxNum, abs(number_[0]))
    return maxNum
  1. permutation을 통해서 우선순위를 정하고 우선순위 리스트(priority)를 돌면서 현재 수식의 부호를 계산해준다.
  2. number와 operator에 차례대로 수와 부호를 뽑아냈기 때문에 첫 부호는 첫 수와 그 다음 수에 영향을 미친다. 즉, operator[i] 는 number[i]와 number[i+1] 에 영향을 미치기 때문에 그에 대한 계산을 진행하고 number에 i와 i+1 번째 수를 제거하고 i번째에 계산된 수를 집어넣었다. operator에서도 현재 계산에 사용한 부호는 pop을 이용해 제거했다.
  3. 모든 부호를 다 사용하여 계산을 하면 number에는 숫자가 하나만 남기때문에 현재 max 값과 number[0]값을 비교하여 더 큰 수를 maxNum에 저장한다.

 

코드 리뷰 후

def solution(expression):
    from itertools import permutations
    import re
    maxNum = -1
    number = list(map(int, re.findall('\d+', expression)))
    operator = re.findall('[-*+]', expression)
    priority = permutations(set(operator),len(set(operator)))

    for i in priority:
        number_ = number[:]
        operator_ = operator[:]
        for now in i:
            j = 0
            while True:
                if j == len(operator_): break
                if now == operator_[j]:
                    tmp = eval(str(number_[j])+now+str(number_[j+1]))
                    number_.pop(j+1)
                    number_.pop(j)
                    number_.insert(j,tmp)
                    operator_.pop(j)
                else: j+=1
        maxNum = max(maxNum, abs(number_[0]))
    return maxNum

 

깨달은 점

  • 포문 도는 리스트에서 pop과 같은 연산을 해서 리스트의 길이가 변하면 포문 도는데 문제가 생긴다. 그래서 다른 조치를 취해서 돌아야 하는데 처음에 a_ = a 이런식으로 초기화를 했는데 디버깅하면서 돌렸는데 a_도 바뀌고 a도 바뀌더라.. 그래서 알게된 것이 a_ = a[:] 이렇게 하면 a의 값만 a_가 받아와서 도는 것 같다. 그냥 a_ = a 하면 포인터마냥 주소를 받아오는건가? 큼큼.. 하여튼 꿀팁!! a_ = a[:] 로 초기화하자.
  • eval(string) 을 알게되었다. string에 수식을 적으면 그 수식대로 실행해서 값을 준다. eval("3+4")를 하면 7을 반환해준다. 그래서 이를 사용해서 코드를 깔끔하게 바꿀 수 있었다.

'Programmers' 카테고리의 다른 글

[프로그래머스] 신규 아이디 추천  (0) 2021.01.27
[프로그래머스] 메뉴 리뉴얼  (0) 2021.01.25
[프로그래머스] 스킬트리  (0) 2021.01.23
[프로그래머스] 압축  (0) 2021.01.22
[프로그래머스] 후보키  (0) 2021.01.22