난이도 : D4
문제번호 :1232
문제 주소 및 출처입니다.
swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV141J8KAIcCFAYD
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
목차
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 |
댓글