문제 설명
현수는 반 친구들의 친구관계를 알고 싶어 한다. 각 학생은 1~N번까지 번호가 붙어 있으며 친구 쌍이 주어질 때, 두 학생이 직접 또는 간접적으로 친구인지를 판별해야 한다.
- 예: (1,2), (2,3), (3,4) → 1과 4는 친구
입력 & 출력
입력 예시
9 7
1 2
2 3
3 4
1 5
6 7
7 8
8 9
3 8
출력 예시
NO
해결 전략: Union-Find
- 친구 관계는 서로소 집합 (Disjoint Set) 구조로 표현할 수 있다.
- 같은 집합에 속하면 친구, 아니라면 친구 아님.
- 각 학생은 부모 노드를 통해 루트(대표 친구)를 찾고,
서로 다른 루트를 가진 두 학생을 친구로 연결(합침)한다.
전체 코드
import java.util.*;
public class Problem6 {
static int[] unf;
public static int Find(int v) {
if (v == unf[v]) return v;
else return unf[v] = Find(unf[v]);
}
public static void Union(int a, int b) {
int fa = Find(a);
int fb = Find(b);
if (fa != fb) unf[fa] = fb;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
unf = new int[n + 1];
for (int i = 1; i <= n; i++) unf[i] = i;
for (int i = 0; i < m; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
Union(a, b);
}
int a = sc.nextInt();
int b = sc.nextInt();
if (Find(a) == Find(b)) System.out.println("YES");
else System.out.println("NO");
sc.close();
}
}
코드 설명
- static int[] unf: Union-Find를 위한 부모 배열 (unf[i]는 i의 대표 번호)
- Find(int v)
- 노드 v의 대표 노드(루트)를 찾음
- 경로 압축 기법 적용 → unf[v] = Find(unf[v])
- 시간 복잡도 거의 O(1)
- Union(int a, int b)
- 두 원소 a, b의 루트를 찾아서 하나로 합침
- 이미 같은 집합이면 아무 일도 하지 않음
- unf[fa] = fb를 통해 병합
- main()
- 입력값: 학생 수 n, 친구 관계 개수 m
- 초기화: unf[i] = i로 자기 자신이 루트가 되도록 설정
- m개의 친구 관계를 입력받아 Union(a, b)로 병합
- 마지막 줄의 두 학생 a, b에 대해 Find(a) == Find(b)인지 판단
→ 같으면 "YES", 아니면 "NO" 출력
시간 복잡도
- Find, Union 모두 거의 O(1) (경로 압축 포함 시)
- 입력 크기 N ≤ 1,000, M ≤ 3,000 → 매우 빠르게 처리 가능
출처: 인프런 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
https://www.inflearn.com/course/자바-알고리즘-문제풀이-코테대비/dashboard
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 강의 | 김태원 - 인프런
김태원 | , 자바(Java) 알고리즘 문제풀이 채점사이트를 통해 기초부터 준비해보세요! 💪 [사진] 이 강의는 [사진] 자바(Java)로 코딩테스트 준비를 하고 계신 분께 추천드려요! 문제는 기초~ 중급
www.inflearn.com
'코딩테스트 > 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비' 카테고리의 다른 글
| 섹션 9 Greedy - 7. 원더랜드(최소스패닝트리 - 프림, PriorityQueue) (0) | 2025.06.13 |
|---|---|
| 섹션 9 Greedy - 7. 원더랜드(최소스패닝트리 - 크루스칼 : Union&Find 이용) (0) | 2025.06.12 |
| 섹션 9 Greedy - 5. 다익스트라 알고리즘 (2) | 2025.06.11 |
| 섹션 9 Greedy - 4. 최대 수입 스케쥴(PriorityQueue 응용문제) (0) | 2025.06.11 |
| 섹션 9 Greedy - 3. 결혼식 (1) | 2025.06.10 |