[14267번 골드4] 회사 문화 1(파이썬, DFS?) 읽기복습 필요

밀루·2023년 4월 1일
0

백준 문제풀이

목록 보기
18/51


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) 로 하면 리스트 프린트할때 대괄호가 안 나온다

profile
벨로그에 틀린 코드나 개선할 내용이 있을 수 있습니다. 지적은 언제나 환영합니다.

0개의 댓글