2021. 8. 15. 08:50, 알고리즘/Programmers
문제 링크
https://programmers.co.kr/learn/courses/30/lessons/72416
예상 난이도
G2
알고리즘 분류
트리 DP
풀이
Tree DP를 몰랐으면 절대 풀 수 없습니다. 다만 Tree DP를 알았으면 구현은 쉬운편이었습니다.
테이블의 정의는 위와 같습니다.
그러면 D[i][0]은 쉽게 식이 도출됩니다.
D[i][1]이 살짝 문제인데, 이 경우에는 자식 중에 누군가는 워크숍에 참석하는게 강제되기 때문에 참석했을 때의 손해가 가장 작은 사람이 참석하면 됩니다.
만약 D[c][0] - D[c][1]이 모두 음수인 자식이 있다면, 그쪽에서는 애초에 워크숍에 참석하는게 이득인 경우이니 D[c][0] - D[c][1]을 더하는게 아니라 그냥 0을 더해야 합니다. 이게 0과의 max를 계산하는 이유입니다. 이후 테이블을 채워나가면 O(N)에 풀 수 있습니다.
트리가 일자로 생겨있을 경우 재귀 깊이가 최대 30만이고 파이썬에서는 별도로 명령을 하지 않으면 최대 재귀 깊이가 1000이기 때문에 런타임 에러가 발생합니다. 그런 데이터가 없는지 sys.setrecursionlimit 명령을 빼도 통과가 가능했지만 저 명령을 넣어 최대 재귀 깊이를 100만으로 늘리는게 바람직합니다.
관련 강의
0x10강 - 다이나믹 프로그래밍
0x19강 - 트리
(제 강의에서 트리 DP는 다루지 않습니다.)
'알고리즘 > Programmers' 카테고리의 다른 글
[2021 카카오 채용연계형 인턴십] Q3. 표 편집 (C++, Python, Java) (4) | 2021.08.16 |
---|---|
[2021 카카오 채용연계형 인턴십] Q2. 거리두기 확인하기 (C++, Python, Java) (2) | 2021.08.16 |
[2021 카카오 채용연계형 인턴십] Q1. 숫자 문자열과 영단어 (C++, Python, Java) (0) | 2021.08.16 |
[2021 KAKAO Blind Recruitment] Q6. 카드 짝 맞추기 (C++, Python, Java) (0) | 2021.08.15 |
[2021 KAKAO Blind Recruitment] Q5. 광고 삽입 (C++, Python, Java) (0) | 2021.08.15 |
[2021 KAKAO Blind Recruitment] Q4. 합승 택시 요금 (C++, Python, Java) (2) | 2021.08.15 |
Comments