삐까냥의 파도타기

1068번) 트리 - 그래프 본문

코딩/백준 알고리즘

1068번) 트리 - 그래프

금손형아 2017. 10. 28. 12:03

문제 출처 : https://www.acmicpc.net/problem/1068



import java.util.Scanner;


public class Q1068 {

static int[][] nodes;

static Scanner sc;

public static void main(String[] args) {

sc = new Scanner(System.in);

int number = sc.nextInt();

nodes = new int[number][2]; //0.부모노드 1.자식노드 개수

for ( int i = 0; i < number; i++ ) {

nodes[i][0] = sc.nextInt();

}

setNode(number); //자식노드 개수 세기

removeNode(sc.nextInt()); //노드 지우기

System.out.println(getLeafNode());

sc.close();

}

static void setNode(int number) {

for ( int i = 0; i < number; i++ ) {

for ( int j = 0; j < number; j++ ) {

if ( nodes[j][0] == i ) {

nodes[i][1] += 1;

}

}

}

}

static void removeNode(int startNode) {

if ( nodes[startNode][0] != -1 ) { //현재노드가 루트 노드가 아니면

nodes[nodes[startNode][0]][1]--; //부모 노드에서 자식 개수 하나 제거

}

nodes[startNode][0] = -2; //부모 노드를 -2로 바꿈으로 노트 제거

if ( nodes[startNode][1] != 0 ) { //자식노드가 있으면

for ( int i = 0; i < nodes.length; i++ ) { //자식노드를 찾아서 제거

if ( nodes[i][0] == startNode ) {

removeNode(i);

}

}

}

}

static int getLeafNode() {

int leafNode = 0;

for ( int i = 0; i < nodes.length; i++ ) {

if ( nodes[i][0] != -2 && nodes[i][1] == 0 ) { //지운 노드(부모가 -2)가 아니면서 leaf 노드일 경우

leafNode++;

}

}

return leafNode;

}

}


'코딩 > 백준 알고리즘' 카테고리의 다른 글

1507번) 궁금한 민호  (0) 2017.10.28
5567번) 결혼식 - 그래프  (0) 2017.10.28
4963번) 섬의 개수 - 그래프  (0) 2017.10.28
1700번) 멀티탭 스케줄링 - 그리디  (0) 2017.10.27
1049번) 기타줄 - 그리디  (0) 2017.10.27