[Python] [SWEA] 사칙연산(1232)

긍정왕·2021년 5월 22일
2

Algorithm

목록 보기
3/69
post-thumbnail

💡 문제 해결

  1. 각 노드에 대한 정보를 받아 딕셔너리에 저장
  2. 시작점은 루트 노드인 1부터 시작하므로 1부터 탐색
  3. 숫자 노드와 연산자를 포함한 노드를 구분하며 탐색
  4. 만약 숫자 노드이면 정수 형태로 return, 연산자 포함 노드이면 연결 된 노드의 정보를 다시 호출하여 연산
  5. 재귀의 형태로 진행

📌 더욱 간단하게 구현이 가능했지만 연산자 관련 문제는 모기업 순차적 알고리즘 코테에서 크게 당해봤기 때문에 수정이 용이하도록 풀어봄



🧾 문제 설명

※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.
사칙연산으로 구성되어 있는 식은 이진 트리로 표현할 수 있다. 아래는 식 “(9/(6-4))*3”을 이진 트리로 표현한 것이다.
임의의 정점에 연산자가 있으면 해당 연산자의 왼쪽 서브 트리의 결과와 오른쪽 서브 트리의 결과를 사용해서 해당 연산자를 적용한다.
사칙연산 “+, -, *, /”와 양의 정수로만 구성된 임의의 이진트리가 주어질 때, 이를 계산한 결과를 출력하는 프로그램을 작성하라.
단, 중간 과정에서의 연산은 실수 연산으로 하되, 최종 결과값이 정수로 떨어지지 않으면 정수부만 출력한다.

문제보기



🖨 입출력



📝 풀이

def numeric_node(node_info, node_num):
    return int(node_info.get(node_num)[0])


def operator_node(node_info, node_num):
    operator, node1, node2 = node_info.get(node_num)
    node1, node2 = int(node1), int(node2)

    if len(node_info[node1]) != 1:
        node1 = operator_node(node_info, node1)
    else:
        node1 = numeric_node(node_info, node1)
    
    if len(node_info[node2]) != 1:
        node2 = operator_node(node_info, node2)
    else:
        node2 = numeric_node(node_info, node2)
    
    if operator == '+':
        return node1 + node2
    elif operator == '-':
        return node1 - node2
    elif operator == '*':
        return node1 * node2
    else:
        return node1 // node2



for tc in range(1, 11):
    N = int(input())
    node_info = dict()
    for _ in range(N):
        tmp_info = list(map(str, input().split()))
        node_info[int(tmp_info[0])] = tmp_info[1:]
    
    answer = operator_node(node_info, 1)
    print(f'#{tc} {answer}')

profile
Impossible + 땀 한방울 == I'm possible

1개의 댓글

comment-user-thumbnail
2021년 5월 24일

설명 깔끔하네요!! 감사합니다 ㅎㅎ

답글 달기