import itertools
def solution(expression):
answer = []
operators = ['+', '-', '*']
operatorPerm = list(itertools.permutations(operators, 3)) # 풀이과정 1
for operator in operatorPerm:
op1 = operator[0]
op2 = operator[1]
partLst = []
for i in expression.split(op1): # 풀이과정 2
part = []
for j in i.split(op2):
part.append(f'({j})') # 풀이과정 3
partLst.append(f'({op2.join(part)})') # 풀이과정 4
answer.append(abs(eval(op1.join(partLst)))) # 풀이과정 5
result = max(answer) # 풀이과정 6
return result
유의했던 사항
1. 연산자는 +, -, * 만 사용
2. 기존의 연산 우선순위를 무시해야함
풀이과정
1. ' +, -, * '로 permutation(순열)을 구해 리스트 만들기
2. 연산자 순열 리스트를 하나씩 돌면서 첫 번째 연산자를 기준으로 split
3. 첫 번째 연산자를 기준으로 split한 것들을 다시 돌면서 두 번째 연산자를 기준으로 split해서 각각을 ( ) 처리
4. 3에서 얻은 것들을 두 번째 연산자로 join해서 append
5. 4에서 얻은 리스트를 첫 번째 연산자로 join해서 append → 모든 연산 수행 후 절댓값
6. 5에서 얻은 리스트 중 max값 return
알게된 것
1. eval( ): 식을 문자열로 받아서 실행하는 함수
→ 식이 문자열로 주어져야 하는데, 이 문제의 경우 expression이 문자열로 주어져서 사용하게 되었다.
2. f'({})' : { }안에 있는 문자열(변수, 함수 호출 결과)을 보여주는데, ' ' 안에만 있으면 { } 밖에 있는 모든 문자들이 { } 안에 있는 문자열과 함께 보여지게 된다.
→ 이 문제의 경우, ( )로 split된 식을 감싸게 되어서 나중에 연산을 할 때 우선순위를 부여해줄 수 있었다.
→ 개인적으로 f-string을 자주 사용하지 않아서 어색한 문법인데 앞으로 자주 사용해서 익숙해져야겠다. 문자열 포맷팅 하기에 아주 유용하다.
-) 흐름을 생각하는 것이 어려웠다. (f-string으로 ( ) 처리를 해서 연산의 우선순위를 부여해주는 것으로 해결)
+) permutation을 사용해 가능한 모든 연산자의 우선순위를 정할 수 있었다.
'코테연습문제' 카테고리의 다른 글
[Programmers/Python] 괄호 변환 (0) | 2023.04.24 |
---|---|
[Programmers/Python] 문자열 압축 (0) | 2023.04.20 |
[Programmers/Python] 튜플 (0) | 2023.04.17 |
[Programmers/Python] 메뉴 리뉴얼 (0) | 2023.04.17 |
[Programmers/Python] 개인정보 수집 유효기간 (0) | 2023.04.15 |