만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

구문 트리 해석하기

시간 제한2초메모리 제한1024 MB

요약
ASCII 격자로 그려진 구문 트리가 주어졌을 때, 이 트리가 나타내는 +, -, * 연산식의 값을 계산합니다.
난이도

보통10점 중 4점

유형
재귀, 트리, 구현
정답자
아직 제출이 없습니다

문제

프로그램을 효율적으로 평가하려고 언어 처리기는 프로그램을 구문 트리로 바꾸는 경우가 많다. 이 문제에서는 ASCII 문자로 표현된 수식의 구문 트리가 주어진다. 이 수식의 값을 계산하라.

이 문제에서 다루는 구문 트리는 각 노드의 자식이 0개 또는 2개인 루트 있는 이진 트리이다. 자식이 0개인 노드는 0 이상 9 이하의 정수 하나에 대응하는 정수 노드이다. 자식이 2개인 노드는 덧셈, 뺄셈, 곱셈 중 하나의 이항 연산에 대응하는 연산 노드이다. 왼쪽 자식과 오른쪽 자식은 각각 왼쪽 피연산자와 오른쪽 피연산자에 대응한다. 예를 들어 그림 B.1은 (9−4)\*((7\*2)+5)(9-4) \* ((7\*2)+5)의 구문 트리를 나타낸다.

그림 B.1: 구문 트리의 예

이 구문 트리를 ASCII 문자로 나타내려고 WW개 문자로 이루어진 문자열 HH개가 주어진다. 각 문자는 '+', '-', '*', '0'부터 '9'까지의 숫자, 또는 빈칸을 뜻하는 마침표 중 하나이다. 그림 B.1의 구문 트리는 다음과 같이 표현된다.

...*.....
.-.....+.
9.4..*..5
....7.2..

그림 B.2는 이 표현의 규칙을 보여준다.

그림 B.2: 구문 트리 표현의 규칙

  • 셀은 정수 노드나 이항 연산 노드 하나에 대응하는 직사각형 문자 영역이다.
  • 정수 노드의 셀은 그 숫자 하나만 담는다. 높이와 너비는 모두 1이다.
  • 이항 연산 노드 vv에 대응하는 셀 cc는 연산자 하나와 두 자식 셀을 담는다. 왼쪽 자식 v1v_1과 오른쪽 자식 v2v_2에 대응하는 셀을 각각 c1c_1, c2c_2라 하자. cc의 높이는 max⁡(h1,h2)+1\max(h_1, h_2) + 1이고, 너비는 w1+w2+1w_1 + w_2 + 1이다. 여기서 h1h_1, h2h_2는 각각 c1c_1, c2c_2의 높이이고, w1w_1, w2w_2는 각각 너비이다. cc의 맨 윗줄은 마침표 w1w_1개, 연산자, 마침표 w2w_2개 순서로 이루어진다. c1c_1은 cc의 2행부터 h1+1h_1+1행, 1열부터 w1w_1열에 위치한다. c2c_2는 2행부터 h2+1h_2+1행, w1+2w_1+2열부터 w1+w2+1w_1+w_2+1열에 위치한다. 두 자식 셀의 높이는 다를 수 있지만 윗변은 항상 맞춰져 있다.
  • 두 셀이 일부만 겹치는 경우는 없다. 겹치면 한쪽이 다른 쪽을 완전히 포함한다.
  • 위 규칙으로 정해지지 않은 나머지 문자는 모두 마침표이다.
  • 전체 문자 영역이 루트 셀이며, 높이는 HH, 너비는 WW이다.

주어진 구문 트리가 나타내는 수식의 값을 계산하라.

입력

첫 줄에 정수 HH와 WW (1≤H,W≤371 \le H, W \le 37)가 주어진다. 다음 HH개 줄에는 각각 길이 WW의 문자열이 주어진다. 각 문자는 '+', '-', '*', '0'부터 '9'까지의 숫자, 또는 마침표이다. 입력은 올바른 형식의 구문 트리를 나타냄이 보장된다.

H W
s_1
...
s_H

출력

입력이 나타내는 수식의 계산 결과를 출력한다.

예제3

  1. 예제 1

    입력
    1 1
    5
    
    예상 출력
    5
    
  2. 예제 2

    입력
    2 3
    .-.
    9.2
    
    예상 출력
    7
    
  3. 예제 3

    입력
    4 9
    ...*.....
    .-.....+.
    9.4..*..5
    ....7.2..
    
    예상 출력
    95