문제
https://programmers.co.kr/learn/courses/30/lessons/67257
처음 작성한 코드
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
- permutation을 통해서 우선순위를 정하고 우선순위 리스트(priority)를 돌면서 현재 수식의 부호를 계산해준다.
- number와 operator에 차례대로 수와 부호를 뽑아냈기 때문에 첫 부호는 첫 수와 그 다음 수에 영향을 미친다. 즉, operator[i] 는 number[i]와 number[i+1] 에 영향을 미치기 때문에 그에 대한 계산을 진행하고 number에 i와 i+1 번째 수를 제거하고 i번째에 계산된 수를 집어넣었다. operator에서도 현재 계산에 사용한 부호는 pop을 이용해 제거했다.
- 모든 부호를 다 사용하여 계산을 하면 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 |