이 글은 인프런 [자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 ] 강의를 수강하며 작성한 글입니다.
자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 - 인프런 | 강의
자바(Java)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 코딩테스트에서 가장 많이 출제되는 Top 10 Topic을 다루고 있습니다. 주제와 연동하여 기초문제부터 중급문제까지 단계적으로 구성
www.inflearn.com
문제 : 다음 그래프에서 1번 정점에서 각 정점으로 가는 최소 이동 간선 수를 출력하라.
입력 :
첫째 줄에는 정점의 수 N(1<=N<=20)와 간선의 수 M가 주어진다. 그 다음부턴 M줄에 걸쳐 연결정보가 주어진다.
입력예시 :
6 9
1 3
1 4
2 1
2 5
3 4
4 5
4 6
6 2
6 5
출력예시 :
2: 3
3: 1
4: 1
5: 2
6: 2
우선 최단거리를 구하는 문제이기 때문에 BFS를 이용해 문제를 풀게 된다. (최단거리 문제는 보통 BFS로 푼다 생각)
또한 그래프는 인접행렬 / 인접리스트의 형태로 구현할 수 있지만 이 문제에서는 인접리스트를 이용한다.
그리고 1번 정점에서 각 정점으로 가는 최소 간선 수를 저장하기 위해 int 배열 dis를 생성한다.
ex) dis[3] = 1번 정점에서 3번까지 가는 최소 간선 수.
dis
0 | 1 | 1 |
: 정점 1에서 한 번만에 갈 수 있는 정점은 3, 4다.
그래서 dis[3] dis[4]에 1을 넣는다.
( 현재 큐: 3, 4)
현재 정점에서 다음 정점으로 가는 최소간선수는 이전 정점의 최소 간선수 + 1이다.
즉, d[nv] = d[v] + 1이다.
dis
0 | 1 | 1 | 2 | 2 |
: 큐에서 poll한 정점 3에서 한 번만에 갈 수 있는 정점은 4가 있지만 이미 방문했으므로 패스.
그 다음 poll한 정점 4에서 한 번만에 갈 수 있는 정점은 5, 6이다.
그래서 dis[5] dis[6]에 2를 넣는다.
( 현재 큐: 5 6)
dis
0 | 3 | 1 | 1 | 2 | 2 |
: 큐에서 poll한 정점 5에서 한 번만에 갈 수 있는 정점이 없으므로 패스.
그 다음 poll한 정점 6에서 한 번만에 갈 수 있는 정점은 2, 5이다. (5는 이미 방문했으므로 패스)
그래서 dis[2]에 3를 넣는다.
( 현재 큐: )
큐에 남아있는 정점이 없으므로 BFS를 종료한다.
채워진 dis 배열을 출력하면 1번부터 각 정점으로 이동하는 최소 간선 수를 알 수 있다.
< 그래프 최단거리 (BFS) 전체 코드 >
public class Main {
private static int n, m;
private static int[] dis;
private static ArrayList<ArrayList<Integer>> graph;
private static int[] ch;
public static void BFS(int v) {
Queue<Integer> q = new LinkedList<>();
ch[v] = 1;
q.offer(v);
while (!q.isEmpty()) {
int cv = q.poll();
for (int nv : graph.get(cv)) {
if (ch[nv] == 0) {
ch[nv] = 1;
q.offer(nv);
dis[nv] = dis[cv] + 1;
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
m = scan.nextInt();
graph = new ArrayList<ArrayList<Integer>>();
ch = new int[n + 1];
dis = new int[n + 1];
for (int i = 0; i <= n; i++) {
graph.add(new ArrayList<Integer>());
}
// 그래프 인접리스트로 만들기
for (int i = 0; i < m; i++) {
int a = scan.nextInt();
int b = scan.nextInt();
graph.get(a).add(b);
}
BFS(1);
for (int i = 2; i <= n; i++) {
System.out.println(i + ": " + dis[i]);
}
}
}
'알고리즘 > 자바 알고리즘 문제풀이: 코딩테스트 대비' 카테고리의 다른 글
[알고리즘/java] DFS 활용 / 바둑이 승차 (0) | 2021.12.28 |
---|---|
[알고리즘/java] DFS 활용 / 합이 같은 부분집합 (0) | 2021.12.27 |
[알고리즘/java] 경로탐색(DFS 인접리스트, ArrayList) (0) | 2021.12.22 |
[알고리즘/java] 경로탐색(DFS 인접행렬, 2차원 배열) (0) | 2021.12.21 |
[알고리즘/java] 그래프와 인접행렬 (0) | 2021.12.21 |