2020 KAKAO INTERNSHIP 수식 최대화 파이썬
바로 이전에 풀었던 거리두기 확인하기와 동일한 2레벨 문제입니다.
이번 문제 풀이는 가장 많은 좋아요를 받은 모범답안을 분석하겠습니다.
접근 방식
- ”+”, “-“, “*” 세개의 연산자로 만들 수 있는 경우의 수는 3!로 6가지 경우입니다.
- 3개 중 2개의 연산자만 활용하여 괄호를 적절하게 넣어준다면 eval함수를 통해서 자연스럽게 3개의 연산자 모두
결과값을 도출할 수 있습니다. - ”+” -> “-“ -> “*” 순서의 경우, 이를 역순으로 이용해서 먼저 +로 split시킨 것을 다시 -로 split 시켜줍니다.
- 이 과정에서 f”()와 join 함수를 활용해서 분리되었을 때 양쪽에 괄호가 붙고 이들 사이에 split에 활용했던
- 연산자를 넣어줍니다.
- 그럼 결과적으로 “+” -> “-“ -> “*” -> “-“ -> “+” 순으로 2개의 연산자만을 이용해서 괄호가 적절하게 분배된
- 연산식을 도출할 수 있습니다.
- 최종적으로 절대값을 취해주고 이를 리스트에 저장하여 가장 큰 값을 return 시키면 됩니다.
def solution(expression): operations = [('+', '-', '*'),('+', '*', '-'),('-', '+', '*'),('-', '*', '+'),('*', '+', '-'),('*', '-', '+')] answer = [] for op in operations: a = op[0] b = op[1] temp_list = [] for e in expression.split(a): temp = [f"({i})" for i in e.split(b)] temp_list.append(f'({b.join(temp)})') answer.append(abs(eval(a.join(temp_list)))) return max(answer)
이번 문제를 풀면서 split 함수를 이용해서 적절하게 연산자를 분리해야 한다는 것과
연산자의 조합에 맞게 분리할 경우, 이는 그 조합을 거꾸로 수행한다는 사실을 인지했습니다.
문제는, 연산자들의 6개 조합을 어떻게 적절하게 for문으로 수행할 것인가, 그리고 split할 때마다
어떻게 양 옆에 괄호를 넣어줄 것인가에 대한 고민이었습니다.
결국, split함수를 수행해주면서 list comprehension과 join함수를 사용해주는 것이 해답이었습니다.
알고리즘도 모든 것과 마찬가지로 꾸준한 연습과 이해를 바탕으로 실력이 향상합니다.
Just do it & Keep steady
댓글남기기