프로그래머스 코딩테스트 고득점 Kit의 문제입니다.
https://programmers.co.kr/learn/challenges?tab=algorithm_practice_kit
문제
https://programmers.co.kr/learn/challenges
내가 작성한 코드
import re
from itertools import permutations
def solution(expression):
answer = 0
for op_order in permutations(["*", "+", "-"]):
operands = list(map(int, re.findall("\d+", expression)))
operator = re.findall("\D", expression)
for crnt_op in op_order:
crnt_operands = []
crnt_operator = []
if operands:
crnt_operands.append(operands[0])
for i in range(1, len(operands)):
crnt_operands.append(operands[i])
crnt_operator.append(operator[i-1])
if crnt_operator[-1] == crnt_op:
two, one = crnt_operands.pop(), crnt_operands.pop()
op = crnt_operator.pop()
if op == "*":
crnt_operands.append(one*two)
elif op == "+":
crnt_operands.append(one+two)
elif op == "-":
crnt_operands.append(one-two)
operands, operator = crnt_operands, crnt_operator
answer = max(answer, abs(operands.pop()))
return answer
- 문자열 연산
- 연산자와 피연산자 분리
- permutations으로 연산자 순서 조합 생성
- stack에 삽입하면서 연산자 순서에 맞는 연산자일 경우 연산 후 삽입
다른 사람이 작성한 코드
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)
- 프로그래머스에 올려둔 다른 분의 코드다
- 연산자 순서에 따라 괄호를 오히려 추가한다
- eval이라는 함수가 문자열 수식을 계산하는 것을 처음 봤다
- 수식 뿐 만 아니라 command를 실행한다고 한다
기억해야할 것
- regex를 이용하면 어렵지 않다고 생각하고 시작했는데, 계산 결과가 마이너스가 되면서 꼬였다
- 위 방식도 expression을 loop마다 copy해서 마음에 들지 않는 방식이다
'코딩테스트' 카테고리의 다른 글
[프로그래머스][KAKAO_인턴][2020] 경주로 건설 (0) | 2021.09.08 |
---|---|
[프로그래머스][KAKAO_인턴][2020] 보석 쇼핑 (0) | 2021.09.08 |
[프로그래머스][KAKAO_인턴][2020] 키패드 누르기 (0) | 2021.09.06 |
[프로그래머스][KAKAO_인턴][2021] 시험장 나누기 (0) | 2021.09.05 |
[프로그래머스][KAKAO_인턴][2021] 미로 탈출 (0) | 2021.09.05 |