일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 그래프
- Greedy
- 알고리즘
- 탐욕법
- django
- Algorithm
- DFS
- Code Refactoring
- 정렬
- 카카오 기출
- 힙
- 문자열
- 백준
- 동적계획법
- Queue
- string
- 프로그래머스
- BFS
- Brute Force
- sort
- binary search
- 큐
- Dynamic Programming
- graph
- programmers
- DP
- heap
- 완전탐색
- DVWA
- 코딩테스트
Archives
- Today
- Total
생각과 고민이 담긴 코드
프로그래머스 - 수식 최대화 (2020 카카오 인턴십) / Level 2 본문
문제 : https://programmers.co.kr/learn/courses/30/lessons/67257
코딩테스트 연습 - 수식 최대화
IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과
programmers.co.kr
풀이
from itertools import permutations
def solution(expression):
answer = []
operators = ["+", "*", "-"]
cases = list(permutations(operators, 3)) # 3!의 경우의 수.
for case in cases:
temp_expression = expression
for operator in case: # operator를 하나씩 적용.
target = ""
calc_fg = False # 현재 계산할 operator가 target에 들어올 경우 True
for i in temp_expression[:]:
if i in operators and len(target) > 0: # i가 연산자이고 왼쪽 피연산자가 있으면
if calc_fg and target[-1] not in operators: # 계산할 준비가 됐고, 오른쪽 피연산자가 있으면 계산.
temp_expression = temp_expression.replace(target, str(eval(target)))
target = str(eval(target))
calc_fg = False
if i == operator: # i가 현재 우선순위에 있는 연산자라면 target에 넣어주고 계산 준비 완료 flag on.
target += i
calc_fg = True
elif target[-1] in operators: # 연산자가 연달아온 경우 -인 unary operator이기 때문에 target에 저장.
target += i
else: # 우선순위에 없는 연산자가 오면 target 초기화.
target = ""
else: # 숫자가 온 경우 target에 추가.
target += i
if calc_fg: # expression 탐색이 끝날때 계산 준비가 되어 있으면 계산해준다.
temp_expression = temp_expression.replace(target, str(eval(target)))
answer.append(abs(int(temp_expression)))
return max(answer)
연산자 우선순위의 경우의 수가 3! = 6 이므로 당연하게 모든 경우를 탐색하여 최대값을 반환하고자 했다.
연산자 중 우선순위가 높은 거부터 차례대로 계산해주는 방식으로 진행했으며
eval 함수를 통한 계산한 결과값을 replace 함수로 문자열을 부분적으로 대체시켜주었다.
맨처음 짜인 로직 내에서 새로 발견된 예외들을 처리하려고 하다 보니 코드가 조금 지저분해진 것 같다.
그에 따른 추후 해결방안을 생각해봤다.
1. 코드 작성 전 알고리즘을 충분히 설계하고 작성하자.
2. 시험볼 때는 무조건 풀어내야 하니 어쩔 수 없지만 연습할 땐 추후 반드시 리팩토링 진행.
'Algorithm > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 튜플 (2019 카카오 개발자 겨울 인턴십) / Level 2 (0) | 2022.01.22 |
---|---|
프로그래머스 - 크레인 인형뽑기 게임 (2019 카카오 개발자 겨울 인턴십) / Level 1 (0) | 2022.01.16 |
프로그래머스 - 키패드 누르기 ( 2020 카카오 인턴십) / Level 1 (0) | 2022.01.03 |
프로그래머스 - 거리두기 확인하기 (2021 카카오 채용연계 인턴십) / Level 2 (0) | 2022.01.03 |
프로그래머스 - 신규 아이디 추천 (2021 KAKAO 블라인드 채용) / Level 1 (0) | 2021.12.12 |