문제
출처 : https://www.acmicpc.net/problem/15900
트리의 정점의 개수 N, N-1개의 줄에 거쳐 간선의 정보가 주어진다.
각 간선의 끝(리프노드)에 게임 말이 존재한다.
성원이와 형석이는 이 게임 말을 한턴에 한번씩 부모노드로 움직이는 방식으로 게임을 진행하려고한다.
게임 말은 루트노드에 도착하면 사라지며, 이 과정을 반복하다 자신의 턴에 더 이상 고를수있는 게임 말이 없다면, 그 사람은 게임에서 패배한다.
항상 성원이가 먼저 시작할때, 성원이가 게임에 승리할 수 있는지 없는지 구하는 프로그램을 만드는 문제다.
풀이
"항상 최적의 선택"이라는 말을 보고 DP 게임이론 문제인가? 라고 의심을 했는데, 매 턴마다 무조건 한칸 위(부모 노드)로 움직여야 하므로 기본 트리탐색으로도 풀리는 문제다.
풀이는 간단하다.
- 모든 게임 말이 루트 노드까지 이동하기 위한(게임말과 루트노드 사이의), 거리 를 구한다. 이 거리가 짝수라면 항상 이길수없고, 홀수라면 항상 이길수있다.
주요 소스코드
private void setNodeDistance(int idx, int distance){
check[idx] = true;
if(tree.get(idx).size() == 1 && idx != 1) dis += distance;
for(int i = 0; i < tree.get(idx).size(); i++){
if(check[tree.get(idx).get(i)]) continue;
setNodeDistance(tree.get(idx).get(i), distance+1);
}
}
전체 소스코드
'알고리즘 (2020 : 08 : 10 ~ ) > 트리' 카테고리의 다른 글
[백준 / BOJ] 23040 누텔라 트리 (Easy) (0) | 2021.10.30 |
---|---|
[백준 / BOJ] 19542 전단지 돌리기 (0) | 2021.09.16 |
[백준 / BOJ] 1240 노드사이의 거리 (0) | 2021.08.07 |
[백준 / BOJ] 20924 트리의 기둥과 가지 (0) | 2021.07.14 |
[백준 / BOJ] 15681 트리와 쿼리 (Java) (0) | 2021.06.07 |