[BOJ] Q16638 괄호 추가하기 2

Question

Language: Python

Difficulty: Gold 1

전체적인 동작과정은 q16637과 유사하지만, 연산자간 우선순위가 존재하므로, 곱연산에 대한 처리를 우선적으로 해줘야한다.

processed_operands=deepcopy(remaining_operands)
processed_operators=deepcopy(remaining_operators)

index=0

#곱하기 연산 먼저 처리
while index < len(processed_operators):
    if processed_operators[index] == "*":
        processed_operators.pop(index)
        processed_operands[index]*=processed_operands[index+1]
        processed_operands.pop(index+1)
        index-=1
    index+=1

Solution

from math import inf
max_result=-inf
def calculate(op1,op2,operator):
    if operator == "+":
        return op1+op2
    elif operator =="-":
        return op1-op2
    elif operator == "*":
        return op1*op2

def processing_parenthesis_and_calculate(operands,operators):
    result=operands[0]
    for index in range(len(operators)):
        result=calculate(result,operands[index+1],operators[index])

    return result

def recursion(count,remaining_operands,remaining_operators,is_Used):
    global max_result

    if count==num:
        if is_Used:
            max_result=max(max_result,processing_parenthesis_and_calculate(remaining_operands,remaining_operators))
        #마지막 항에 대해서 괄호를 사용하지 않은 경우 마지막 피연산자도 추가한다.
        else:
            max_result=max(max_result,processing_parenthesis_and_calculate(remaining_operands+[operands[count]],remaining_operators))

        return
    #이전에 괄호를 취하지 않은 경우
    if is_Used==False:
        #현재 괄호를 취하는 경우 괄호 계산후에 해당 피연산자항 추가
        recursion(count+1,remaining_operands+[calculate(operands[count],operands[count+1],operators[count])],remaining_operators,True)
        #현재 괄호를 취하지 않는 경우 피연산자와 연사자항 추가
        recursion(count+1,remaining_operands+[operands[count]],remaining_operators+[operators[count]],False)

    #이전에 괄호를 취한 경우
    else:
        # 연산자만 추가한다.
        recursion(count+1,remaining_operands,remaining_operators+[operators[count]],False)   
         
def solution():

    for segment in expression:
        if "0"<=segment<="9":
            operands.append(int(segment))
        else:
            operators.append(segment)

    parenthesized=[False] * len(operators)
    recursion(0,[],[],False)
    
    print(max_result)
        
if __name__ == "__main__":
    length=0
    expression=""
    num=0
    operands=[]
    operators=[]

    length=int(input())
    expression=list(input())
    num=length//2 
    solution()

아니면, python의 문자열의 기반 연산을 수행하는 eval 함수를 이용하면 간편하게 연산을 수행할 수 있다.

Solution 2

from math import inf

max_result=-inf
def recursion(count,is_Used,expression):
    global max_result

    if count==num:
        if is_Used:
            max_result=max(max_result,eval(expression))
        #마지막 항에 대해서 괄호를 사용하지 않은 경우 마지막 피연산자도 추가한다.
        else:
            max_result=max(max_result,eval(expression+operands[count]))

        return
    #이전에 괄호를 취하지 않은 경우
    if is_Used==False:
        #현재 괄호를 취하는 경우 괄호 계산후에 해당 피연산자항 추가
        recursion(count+1,True,expression+"("+operands[count]+operators[count]+operands[count+1]+")")
        #현재 괄호를 취하지 않는 경우 피연산자와 연사자항 추가
        recursion(count+1,False,expression+operands[count]+operators[count])

    #이전에 괄호를 취한 경우
    else:
        # 연산자만 추가한다.
        recursion(count+1,False,expression+operators[count]) 
         
def solution():

    for segment in expression:
        if "0"<=segment<="9":
            operands.append(segment)
        else:
            operators.append(segment)

    recursion(0,False,"")
    print(max_result)

if __name__ == "__main__":
    length=0
    expression=""
    num=0
    operands=[]
    operators=[]

    length=int(input())
    expression=list(input())
    num=length//2 
    solution()
   
    

댓글남기기