https://www.acmicpc.net/problem/14267
아래는 내가 짠 코드
직속 부하 노드를 dict 형태로 만들어서 자신이 받은 칭찬을 자식 노드들에게 더해줬다.
visited 리스트를 만들지 말지 고민했는데, 안 만드는게 맞다.
import sys
companydict = {}
def makeDict(index, human):
try:
companydict[human].append(index)
except:
companydict[human] = [index]
def dfs(x):
if x in companydict:
staff_list = companydict[x]
for staff in staff_list:
praise[staff] += praise[x]
if __name__ == "__main__":
n, m = map(int, sys.stdin.readline().split())
praise = [0 for _ in range(n+1)] # praise[i] = i번째 회사원이 칭찬을 받은 횟수
company = [0] + list(map(int, sys.stdin.readline().split()))
for idx, person in enumerate(company):
makeDict(idx, person)
companydict.pop(0)
companydict.pop(-1)
# print(companydict)
# {1: [2, 3, 4], 3: [5, 6], 4:[7], 7:[8], 8: [9]}
for _ in range(m):
person, get = map(int, sys.stdin.readline().split())
praise[person] += get
for i in range(2, n+1):
dfs(i)
print(*praise[1:])
그리고 이건 내가 본 제일 짧은 코드
import sys
input = sys.stdin.readline
print = sys.stdout.write
def sol():
n, m = map(int, input().split())
maps = [0] + list(map(int, input().split()))
good_stamp = [0] * (n + 1)
for _ in range(m):
i, w = map(int, input().split())
good_stamp[i] += w
print('0 ')
for i in range(2, n + 1):
good_stamp[i] += good_stamp[maps[i]]
print("%d " % good_stamp[i])
sol()
시간 복잡도도 실로 완벽한 코드였다. (아래가 내가 짠 코드, 위가 다른 사람이 푼 코드)
내가 짠 코드 읽으면서 공부하기
그리고 visited를 왜 안 써도 되는지 생각해보기
print(*praise) 로 하면 리스트 프린트할때 대괄호가 안 나온다