고딩왕 코범석
[프로그래머스] 수식 최대화, Python3 본문
반응형
이번 포스팅에서는 2020 카카오 인턴십 코딩테스트 문제 중 두 번째 문제인 수식 최대화 문제에 대해 풀이를 해볼 것이다.
- 문제 설명
- 제한 사항
- 테스트케이스
우선 나는 이 문제를 어떻게 풀지 몰라 감이 안잡혀 다른 분의 코드를 참조했다.거의 베낀 것이나 다를바 없다
그치만 코드를 하나씩 살펴보면서 재귀에 대한 이해, 재귀를 사용할 때 코드의 간결함을 보고 많이 배운 코드였다.
- 풀이 방법
- priorities 라는 배열을 선언했다. 이곳에는 연산자들의 우선순위를 담아두었다.
- priorities에 있는 우선순위들을 하나씩 대입하여 해당 연산의 결과를 얻어낸다.
- 연산 결과를 절댓값으로 바꾸어 최댓값을 비교하고 정답을 리턴한다.
def get_result(n, priority, expression):
if n == 2:
return str(eval(expression))
if priority[n] == '*':
result = eval('*'.join([get_result(n + 1, priority, e) for e in expression.split('*')]))
if priority[n] == '+':
result = eval('+'.join([get_result(n + 1, priority, e) for e in expression.split('+')]))
if priority[n] == '-':
result = eval('-'.join([get_result(n + 1, priority, e) for e in expression.split('-')]))
return str(result)
def solution(expression):
answer = 0
priorities = [
('*', '+', '-'),
('*', '-', '+'),
('+', '-', '*'),
('+', '*', '-'),
('-', '+', '*'),
('-', '*', '+')
]
for priority in priorities:
result = get_result(0, priority, expression)
answer = max(answer, abs(int(result)))
return answer
풀이 방법은 무슨 범접할 수 없는 세계관을 가진거 마냥 쉽게 써놨는데 재귀에 대한 이해, eval의 활용이 까다로워서 작성된 코드의 get_result를 세세하게 풀어보려고 한다.
def get_result(n, priority, expression):
if n == 2:
return str(eval(expression))
if priority[n] == '*':
result = eval('*'.join([get_result(n + 1, priority, e) for e in expression.split('*')]))
if priority[n] == '+':
result = eval('+'.join([get_result(n + 1, priority, e) for e in expression.split('+')]))
if priority[n] == '-':
result = eval('-'.join([get_result(n + 1, priority, e) for e in expression.split('-')]))
return str(result)
먼저 문제 설명에서 주어진 Expression = "100-200*300-500+20", 연산자의 우선 순위가 +, -, * 일 경우 22,000원이 나오는 과정을 보겠다.
이러한 과정속에 22,000 이라는 결과가 나오며 문제 설명의 연산자 우선순위와 반대가 되어있다.
그 이유는 맨 앞의 우선순위를 가진 연산자를 제일 먼저 계산해줘야한다. n == 2 조건이 결국 남은 연산자를 eval 함수를 활용하여 연산이 수행되는 것이고 n==0, 1 일때는 연산을 미룬 것이다.
이말을 다시 말하면 연산의 우선순위의 역순으로 일단 split 해준다. n==2 일때는 연산을 수행해줘야 하므로 이 때 연산되는 연산자가 연산의 우선순위가 첫번째를 기준으로 연산 되는것이다.
오늘은 그럼 여기까지! 피드백 및 댓글은 환영합니당ㅎㅎㅎ
반응형
'Computer Science > Algorithm' 카테고리의 다른 글
[프로그래머스] 동굴 탐험, Python3 (0) | 2021.01.22 |
---|---|
[프로그래머스] 매칭 점수, Python3 (0) | 2021.01.20 |
[프로그래머스] 징검다리 건너기, Python3 (0) | 2021.01.19 |
[프로그래머스] 보석 쇼핑, Python3 (0) | 2021.01.18 |
[프로그래머스] 키패드 누르기, Python3 (0) | 2021.01.06 |