백준 문제풀이
16637번: 괄호 추가하기 / gold 3 / 브루트포스
RonLee
2023. 4. 28. 13:49
https://www.acmicpc.net/problem/16637
16637번: 괄호 추가하기
길이가 N인 수식이 있다. 수식은 0보다 크거나 같고, 9보다 작거나 같은 정수와 연산자(+, -, ×)로 이루어져 있다. 연산자 우선순위는 모두 동일하기 때문에, 수식을 계산할 때는 왼쪽에서부터 순
www.acmicpc.net
'''
16637번: 괄호 추가하기 / gold 3 / 브루트포스
'''
import sys
import itertools
input = sys.stdin.readline
# a와 b를 연산해주고 결과를 리턴하는 함수
def calculator(a, op, b):
if op == '+':
return a + b
elif op == '-':
return a - b
elif op == '*':
return a * b
# 괄호가 있는 연산자 인덱스 case 포함, 식 계산하는 함수
def case_result(case):
i = 0
if 0 in case:
res = calculator(num_lst[0], op_lst[0], num_lst[1])
i += 1
else:
res = num_lst[0]
while i <= len(op_lst) - 1:
if i + 1 in case:
tmp = calculator(num_lst[i + 1], op_lst[i + 1], num_lst[i + 2])
res = calculator(res, op_lst[i], tmp)
i += 2
else:
res = calculator(res, op_lst[i], num_lst[i + 1])
i += 1
return res
# 괄호 (1~max_bracket)개 일때의 경우를 만드는 함수
def make_case():
case = [()]
op_case = [i for i in range(len(op_lst))]
max_bracket = len(num_lst) // 2
bracket = 1
while bracket <= max_bracket:
tmp_case = itertools.combinations(op_case, bracket)
case += tmp_case
bracket += 1
return case
# 괄호 케이스 적합한지 체크하는 함수
def check_case(case):
flag = True
if len(case) >= 2:
for i in range(1, len(case) - 1):
if case[i - 1] == case[i] - 1:
flag = False
return flag
def max_result():
# 괄호 케이스들 만들기
parentheses_case = make_case()
max_res = -int(1e9)
# 괄호 케이스 하나씩 확인하기
for case in parentheses_case:
# 만일, 해당 괄호 케이스가 적합하다면, 괄호 케이스를 적용해서 식 결과 계산
if check_case(case):
res = case_result(case)
if max_res < res:
max_res = res
print(max_res)
# 수식의 길이 N, 수식 expression 입력받기
N = int(input())
expression = input().rstrip()
# 입력받은 수식을 숫자, 연산자 분류하기
num_lst = []
op_lst = []
for i in range(len(expression)):
if i % 2 == 0:
num_lst.append(int(expression[i]))
else:
op_lst.append(expression[i])
# 결과값 구하기
max_result()
코드 리뷰
- 해당 문제를 푸는데 약 1시간 30분 정도 소요, 정답 판정을 받았습니다.
- 브루트포스 문제로 골드 구현문제와 비슷하게 빡구현 느낌이 나는 문제였습니다!!
<깊게 생각해야 할 부분>
- 괄호 케이스들을 만드는 코드 (브루트포스)
/ 괄호 하나에 무조건 연산자 한 개밖에 들어 올 수 있습니다.
/ 따라서 연산자 리스트와 연산자 인덱스 번호리스트를 만들어 조합을 이용 -> 괄호 케이스를 만들었습니다.
/ 예를들어, 괄호가 2개일때 : (0,1)(0,2)(0,3)(1,2)(1,3) ...
- 괄호 케이스를 적용해서 식 계산을 하는 코드
/ 연산자의 우선순위가 없기에 괄호가 없으면, 왼쪽에서 오른쪽으로 계산합니다.
/ 괄호가 있는 경우에는, 어떻게 식을 계산하는지 고민해서 코드를 짜야 합니다.