14367. 회사문화1
14267번: 회사 문화 1
영선회사에는 매우 좋은 문화가 있는데, 바로 상사가 직속 부하를 칭찬하면 그 부하가 부하의 직속 부하를 연쇄적으로 칭찬하는 내리 칭찬이 있다. 즉, 상사가 한 직속 부하를 칭찬하면 그 부하
www.acmicpc.net
- 첫 풀이
- 시간초과
- dfs
import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
n, m = map(int, input().split())
employee = [[] for _ in range(n+1)]
superior = list(map(int, input().split()))
compliment = [0 for _ in range(n+1)]
def dfs(emp_num, value):
for k in employee[emp_num]:
compliment[k] += value
dfs(k, value)
for i in range(1, n+1):
# 부하직원들을 담음
if superior[i-1] <= 1:
continue
employee[superior[i-1]].append(i)
for _ in range(m):
emp_num, v = map(int, input().split())
compliment[emp_num] += v
dfs(emp_num, v)
print(*compliment[1:])
- 두번째 풀이
- bfs
from collections import deque, defaultdict
n, m = map(int, input().split())
superior = list(map(int, input().split()))
employee = defaultdict(list)
# 직속 부하를 담음
for i in range(1, n):
employee[superior[i]].append(i+1)
compliment = [0 for _ in range(n+1)]
def bfs(emp_num):
visited = [False for _ in range(n+1)]
queue = deque()
queue.append(emp_num)
while queue:
x = queue.popleft()
if visited[x] == True:
continue
visited[x] = True
for emp in employee[x]:
if not visited[emp]:
queue.append(emp)
# 부하한테 내칭찬 더해줌
compliment[emp] += compliment[x]
for _ in range(m):
emp_num, v = map(int, input().split())
compliment[emp_num] += v
bfs(1)
print(*compliment[1:])
'코딩테스트 > BOJ' 카테고리의 다른 글
| [백준][순열] 15659. 연산자 끼워넣기(3) (0) | 2023.11.05 |
|---|---|
| [백준][진법] 1394. 암호 (0) | 2023.10.29 |
| [백준] [백트래킹] 2661. 좋은 수열 (1) | 2023.10.17 |
| [백준][DP] 2011. 암호코드 풀이 (0) | 2023.10.15 |
| [백준][최장연속부분수열][투포인터] 20922. 겹치는 건 싫어 (0) | 2023.10.14 |