난이도 : D4
문제번호 :1232
문제 주소 및 출처입니다.
swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV141J8KAIcCFAYD
목차
1. 문제 설명
2. 문제 해석
3. 소스 코드
1. 문제 설명
사칙연산으로 구성되어 있는 식은 이진 트리로 표현할 수 있다. 아래는 식 “(9/(6-4))*3”을 이진 트리로 표현한 것이다.
|
입력
각 테스트 케이스의 첫 줄에는 각 케이스의 트리가 갖는 정점의 총 수 N(1≤N≤1000)이 주어진다. 그 다음 N줄에 걸쳐 각각의 정점 정보가 주어진다. |
출력
#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스에 대한 답을 출력한다. 답은 항상 정수값으로 기록한다. |
예시
입력 | 출력 |
홈페이지 참조 | 홈페이지 참조 |
2. 문제풀이
메모이제이션과 비슷한 기법으로 풀 수 있습니다. 1번 노드부터 확인을 시작하는데 노드에 들어있는 값이 숫자가 아니라면 재귀를 이용하여 자식노드의 값을 가져옵니다. 물론 자식노드 또한 숫자가 아닐 수 있습니다. 그럴 경우 계속 밑으로 타고 내려가서 계산을 하게됩니다. 자식노드가 모두 숫자라면 자신이 가지고 있는 연산자를 통해 계산을 하고 자신의 위치에 연산된 값을 넣어줍니다. 트리구조여서 이해가 안되실 수 있습니다. 함수의 기능별로 분리를 해놨으니 분석을 통해 이해를 하실 수 있을것 같습니다. |
3. 소스코드
# 1232 사칙연산 D4
def solution():
N = int(input())
node_connect_list = [[] for _ in range(N+1)]
node_value_list = [0 for _ in range(N+1)]
data_init(N, node_connect_list, node_value_list)
return calculate_node(1, node_connect_list, node_value_list)
def data_init(N, node_connect_list, node_value_list):
for _ in range(N):
user_input = input().split()
node_index = int(user_input[0])
node_value = user_input[1]
node_value_list[node_index] = node_value
if len(user_input) != 2:
node_connect_list[node_index].append(user_input[2])
node_connect_list[node_index].append(user_input[3])
def calculate_node(idx, node_connect_list, node_value_list):
if not len(node_connect_list[idx]):
return node_value_list[idx]
operator = node_value_list[idx]
first_child_index = int(node_connect_list[idx][0])
second_child_index = int(node_connect_list[idx][1])
first_child_value = calculate_node(first_child_index, node_connect_list, node_value_list)
second_child_value = calculate_node(second_child_index, node_connect_list, node_value_list)
node_value_list[idx] = calulate(first_child_value, operator, second_child_value)
return node_value_list[idx]
def calulate(value1, operator, value2):
value1 = int(value1)
value2 = int(value2)
if operator == '+':
return value1 + value2
elif operator == '-':
return value1 - value2
elif operator == '*':
return value1 * value2
elif operator == '/':
return value1 // value2
print('error')
test_case = 10
for tc in range(test_case):
answer = solution()
print('#{} {}'.format(tc+1, answer))
|
'코딩테스트 > SWExpertAcademy' 카테고리의 다른 글
이진힙 Python(SW Expert Academy) (0) | 2021.04.06 |
---|---|
길찾기 Python(SW Expert Academy) (0) | 2021.02.24 |
오목 판정 Python(SW Expert Academy, SWEA) (0) | 2021.02.23 |
진기의 최고급 붕어빵 Python(SWEA) (0) | 2021.02.21 |
현주의 상자 바꾸기 Python(SWEA) (0) | 2021.02.19 |
댓글