처음 코드
tc = int(input())
for idx in range(1, tc+1):
n, m, l = map(int, input().split()) # 노드의 개수 n, 리프 노드의 개수 m, 값을 출력할 노드 번호 l
node = [0 for _ in range(n+1)]
for _ in range(m):
leaf, num = map(int, input().split())
node[leaf] = num
if n % 2: # 노드의 개수가 홀수인경우 아래에서 자식노드 i, i+1을 더해서 부모노드에 넣어주니까
n -= 1 # -1을 해줄 필요가 있다. (즉, i+1때문에)
for i in range(n, 1, -2):
try: # 자식 노드 두개 더해서 부모 노드에 넣어준다.
node[i//2] = node[i] + node[i + 1]
except IndexError:
node[i//2] = node[i] # 노드 개수 짝수인 경우는 하나 남기 때문에 예외처리.
if node[l]: # 출력할 노드 번호의 값을 찾았다면 멈춰
break
print('#{} {}'.format(idx, node[l]))
두번째 코드
팀원의 도움을 받아 더 간단해졌다.
노드의 개수가 홀수인지 짝수인지 구분할 필요 없고, try except문을 쓸 필요 없이
node 리스트를 넉넉하게 만들었다.
tc = int(input())
for idx in range(1, tc+1):
n, m, l = map(int, input().split()) # 노드의 개수 n, 리프 노드의 개수 m, 값을 출력할 노드 번호 l
node = [0 for _ in range(n+2)] # n이 짝수인 경우, 노드 개수가 하나 남기 때문에 아래에서 인덱스 에러를 막기 위해 넉넉하게 하나 더 만들어줌
# 리프 노드 데이터 삽입
for _ in range(m):
leaf, num = map(int, input().split())
node[leaf] = num
# 값이 비어있는 노드부터 거꾸로 올라감
for i in range(n-m, 0, -1):
node[i] = node[i*2] + node[i*2+1] # 부모노드 i에 자식노드 두개 더해 넣어주기
print('#{} {}'.format(idx, node[l]))
다른 팀원의 코드
1. 재귀로 해결
def recur(cur):
if cur > N: # 인덱스 초과하면 0리턴해야 0더함
return 0
if node[cur]: # 값 있으면 그거 리턴해,기저 조건
return node[cur]
return recur(cur * 2) + recur(cur * 2 + 1)
tc = int(input())
for k in range(1, tc + 1):
N, M, L = map(int, input().split()) # 노드개수, 리프노드개수, 출력할노드
leaf = [list(map(int, input().split())) for i in range(M)] # 리프노드 번호, 자연수
node = [0 for i in range(N + 1)]
for i in range(M):
node[leaf[i][0]] = leaf[i][1]
print('#{} {}'.format(k, recur(L)))
2. 후위 순회로 해결
def post_order(n):
if n <= N and not node[n]:
post_order(2*n)
post_order(2*n+1)
node[n] = node[2*n] + node[2*n+1]
for tc in range(int(input())):
N, M, L = map(int, input().split()) # N: 노드 개수, M: 리프 노드 개수, L: 출력할 노드 번호
node = [0] * (N+2) # 마지막 노드의 형제가 없는 경우 index error를 피하기 위해
# 리프 노드 채우기
for _ in range(M):
n, v = map(int, input().split())
node[n] = v
# node 채우기 (후위 순회)
post_order(1)
print('#{} {}'.format(tc+1, node[L]))
'Algorithm > SW Expert Academy' 카테고리의 다른 글
[Python] 5185. 이진수 (0) | 2021.09.30 |
---|---|
[Python] 1240. 단순 2진 암호코드 (0) | 2021.09.29 |
[Python] 5177. 이진힙 (0) | 2021.09.24 |
[Python] 5176. 이진탐색 (0) | 2021.09.24 |
[Python] 5174. subtree (0) | 2021.09.24 |