반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 다이나믹 프로그래밍
- BFS
- ★
- 알고리즘공부
- 자바
- 시간 복잡도
- 브루트포스
- 자바공부
- 백준알고리즘
- 빅오 표기법
- Java개념
- 백준
- 백준9단계
- 백트래킹
- 무료개발강의
- java
- 코딩공부
- 개발공부
- dfs
- 백준단계별로풀어보기
- 무료코딩강의
- 자바개념
- 백준자바
- 동적계획법
- 자바의정석연습문제풀이
- 알고리즘
- ☆
- dp
- 자바의정석연습문제
- 자바의정석
Archives
- Today
- Total
더 많이 실패하기
공부 100일차: 백준 11437번 LCA 자바 java ☆실패 본문
반응형
11437 LCA
https://www.acmicpc.net/problem/11437
11437번: LCA
첫째 줄에 노드의 개수 N이 주어지고, 다음 N-1개 줄에는 트리 상에서 연결된 두 정점이 주어진다. 그 다음 줄에는 가장 가까운 공통 조상을 알고싶은 쌍의 개수 M이 주어지고, 다음 M개 줄에는 정
www.acmicpc.net
백준 11437번 문제 LCA
문제
과정 생각해보기 & 오답
LCA란 Lowest Common Ancestor의 약자로, 최소 공통 조상이라는 의미다
이러한 트리 구조 예시의 경우, 노드 9와 11의 최소 공통 조상(LCA)은 2다
조상을 구하기 위한 알고리즘을 생각해보면
1. 모든 노드의 깊이를 계산한다 (DFS 이용)
2. LCA를 구해야 하는 두 노드를 구한다
① 두 노드의 깊이가 같아지도록 거슬러 올라간다
② 깊이가 같아졌으면, 부모가 같아질 때까지 같은 크기로 부모의 방향으로 거슬러 올라간다
3. 모든 LCA 연산에 대해 2번 과정을 반복한다
라고 볼 수 있다
참고: https://www.youtube.com/watch?v=O895NbxirM8
참고 블로그: https://iamheesoo.github.io/blog/algo-boj11437
자꾸 인덱스 범위 벗어났다고(ArrayList인데 왜..?) 뜬 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Day72BOJ11437Fail {
static int n;
static ArrayList<ArrayList<Integer>> tree;
static int[] depth;
static int[] parent;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
// 트리 생성
tree = new ArrayList<>();
for(int i = 0; i <= n; i++) {
tree.add(new ArrayList<Integer>());
}
StringTokenizer st = null;
for(int i = 0; i < n - 1; i++) { //주어진 숫자로 노드 연결
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
tree.get(a).add(b);
tree.get(b).add(a);
}
depth = new int[n+1];
parent = new int[n+1];
// 2. 대상이 되는 두 노드 구하기
dfs(1,1);
int m = Integer.parseInt(br.readLine());
for(int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
System.out.println(solve(a,b));
}
}
// 1. 모든 노드의 깊이 계산 (dfs 이용)
public static void dfs(int node, int currentDepth) {
depth[node] = currentDepth;
for(int child: tree.get(node)) {
if(depth[child] == 0) { //깊이 계산이 안 됐다면(자식 노드라면)
dfs(child, currentDepth++); // 깊이+1
parent[child]=node;
}
}
}
public static int solve(int a, int b) {
// 2-1. 두 노드의 깊이가 같아지도록
while(depth[a] > depth[b]) { // 노드 a가 더 밑에 있다면
a = parent[a];
}
while(depth[a] < depth[b]) { // 노드 b가 더 밑에 있다면
b = parent[b];
}
// 2-2. 부모가 같아질 때까지 부모 방향으로 거슬러 올라가기
while(a != b) { // 같은 층이지만 부모가 다르다면
a = parent[a];
b = parent[b];
}
return a;
}
}
|
cs |
시간이 모자라서 내일 다시 해야 한다..
내일 차근차근 다시 살펴볼 예정.. dfs도 공부해야 하긴 했으니까 마음 편하게 먹고 찬찬히 봐야겠다
+여전히 안 보여서 일단 보류.. ㅠㅠ 주말에 시간여유 많을 때 보기로..
반응형
'알고리즘 > 백준' 카테고리의 다른 글
공부 102일차: 백준 11399번 ATM 자바 java (0) | 2022.11.09 |
---|---|
공부 101일차: 백준 11047번 동전 0 자바 java (0) | 2022.11.08 |
공부 99일차: 백준 12871번 무한 문자열 자바 java (0) | 2022.11.06 |
공부 98일차: 백준 2004번 조합 0의 개수 자바 java (0) | 2022.11.05 |
공부 97일차: 백준 1676번 팩토리얼 0의 개수 자바 java (0) | 2022.11.04 |
Comments