BOJ_11725_트리의 부모 찾기
2021. 11. 19. 01:06ㆍ백준 알고리즘(BOJ)
1
구분: 그래프 이론, 그래프 탐색, 트리, 너비우선탐색, 깊이 우선탐색
언어: Java
전략
- 루트 노드인 1부터 시작
- 노드들 간 연결 요소를 ArrayList배열을 이용 - 각 배열마다 ArrayList선언 필요
- 자신과 연결된 노드들 이 내 자식이다
- 부모의 번호를 담을 배열을 준비한다
- 나와 연결되어 있는데, 이미 부모가 설정된것(나의 부모이다). 그렇지 않은 것들의 부모를 저장
- bfs: 한 노드에서 자신과 연결된 모든 노드를 바로 자식으로 여기기 때문에
2. 코드
import java.util.Scanner;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
static int[] parent; //부모를 담을 배열
static ArrayList<Integer>[] list;//연결 관계를 나타낼 리스트 배열
static int n;//전체 노드의 수
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
//배열이기 떄문에 각 배열마다
list = new ArrayList[n+1];
for(int i = 0; i<=n; i++) {
list[i] = new ArrayList<>();
}
//입력을 받는다. 양방향 연결이다
for(int i = 0; i<n-1; i++) {
int a = scanner.nextInt();
int b = scanner.nextInt();
list[a].add(b);
list[b].add(a);
}
bfs();
//2번부터 출력
for(int i = 2; i<=n; i++) {
System.out.println(parent[i]);
}
}//main
private static void bfs() {
Queue<Integer> q = new LinkedList();
parent = new int[n+1];
q.add(1);
parent[1] = 1;
while(!q.isEmpty()) {
//현재 노드 번호
int cur = q.poll();
//각 노드와 연결된 수
int size = list[cur].size();
//연결된 것들을 돌면서
for(int i = 0; i<size; i++) {
int temp = list[cur].get(i);
//만약 이미 부모가 정해져 있다면 지나가
if(parent[temp] != 0) continue;
//이것의 부모를 나 자신으로 한다
parent[temp] = cur;
q.add(temp);
}
}
}
}
3
- 메모리 초과가 났다.
- 노드들 간 연결을 나타내는 방법 - 인접 리스트, 인접 행렬 모두 사용해보았다
- 내가 사용하는 인접행렬이 문제일 것 같다고 판단하였다
//연결 리스트를 위해 시도한 형태
static class Node{
int vertex;
Node link;
Node(int vertex, Node link){
this.vertex = vertex;
this.link = link;
}
}
static Node[] list;
- ArrayList배열을 사용하니 메모리 초과가 발생하지 않았다
- 요즘 문제를 풀면 메모리 초과, 시간 초과가 나는데 조금 슬프다
'백준 알고리즘(BOJ)' 카테고리의 다른 글
BOJ_16439_치킨치킨치킨 (0) | 2021.12.07 |
---|---|
BOJ_15721_번데기 (0) | 2021.12.07 |
BOJ_16938_캠프 준비 (0) | 2021.11.12 |
BOJ_11279_최대 힙 (0) | 2021.11.11 |
BOJ_16987_계란으로 계란치기 (0) | 2021.11.08 |