728x90
반응형
문제 설명
1. 몇개의 노드가 주어질지 입력
2. 순서대로 노드가 주어진다.
3. 어떤 노드를 지울지 알려준다.
4. 그 노드랑 이 노드의 모든 자식노드를 지원 후 남은 자식노드 갯수 구하기
풀이 과정
1. 처음에는 그냥 어떤 노드의 자식들을 모두 보관하게 하고 그 노드를 기준으로 자식을 확인해가면서 삭제해줬다.
2. 그리고 ans는 처음에 모든 자식없는 노드들을 확인해서 만들어줬다.
3. 리프노드 도달시 하나씩 뺴줘서 처리했다.
4. 이랬더니 중간에 틀렸는데, 이유를 생각해보니 어떤 노드의 부모가 그 노드만을 자식으로 가진다면 문제가 될 것 같았다.
(O-O-O 이렇게 돼있으면 안됨)
5. 여러 방법이 있었겠지만... 나는 그냥 그 노드의 부모를 갖는 Map을 하나 더 만들어서 부모 찾고 자식이 하나뿐이면 더해주는 식으로 해결했다. <- 깔끔한 방법이 아니라 그냥 앳지케이스 핸들링
코드
import java.util.*;
public class Main
{
private static Map<Integer, List<Integer>> parentMap = new HashMap<>();
private static Map<Integer, Integer> findParent = new HashMap<>();
private static int ans = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count = Integer.parseInt(sc.nextLine());
for (int i=0; i<count; i++) {
int parent = sc.nextInt();
findParent.put(i, parent); // 지금 들어가는 노드의 부모를 찾는다.
if(parent == -1) continue;
List<Integer> children = parentMap.getOrDefault(parent, new ArrayList<Integer>()); // 어떤 노드의 자식들을 보관한다.
children.add(i);
parentMap.put(parent, children); // key: 부모, value: 자식
}
int remove = sc.nextInt();
for(int i=0; i<count; i++) {
if(!parentMap.containsKey(i)) ans++; // 자식이 없는 노드는 리프노드이다.
}
// 검색할 때에 이 부모가 하나의 자식밖에 없다면 이게 지워지면 그 부모가 리프노드가 된다.
if(parentMap.getOrDefault(findParent.get(remove), new ArrayList<Integer>()).size() == 1) ans++;
if(remove >=0 && remove < count) DFS(remove);
System.out.println(ans);
}
// 삭제 대상 확인 DFS
private static void DFS(int parent) {
// 지금 이게 자식이 없는 노드이면 리프노드이므로 삭제처리
if (!parentMap.containsKey(parent)) {
ans--;
return;
}
// 부모노드라면 자식들을 제거
List<Integer> children = parentMap.get(parent);
for(int child : children) DFS(child);
}
}
반응형
'알고리즘 공부' 카테고리의 다른 글
[백준 1245번] 산봉우리 - java (0) | 2024.12.15 |
---|---|
[백준 7490번] 0 만들기 - java (1) | 2024.12.08 |
[백준 12919번] A와 B 2 - java (1) | 2024.12.04 |
[백준 20529번] 가장 가까운 세 사람의 심리적 거리 - java (0) | 2024.12.03 |
[백준 1446번] 지름길 - java (0) | 2024.12.02 |