💡문제 분석 요약
입력받은 그래프의 정보를 DFS와 BFS로 탐색한 결과를 출력하는 문제이다.
- 시간 제한: 2초
- 메모리 제한: 128MB
💡알고리즘 설계
- 그래프 정보를 인접 행렬로 저장한다.
- DFS 구현
- 재귀 함수를 이용한다.
- 방문한 노드를 visited = true(방문 체크)로 설정하고 StringBuilder에 저장한다.
- 해당 노드와 인접한 노드 중 방문하지 않은 노드(visited == false)를 재귀 호출한다.
- BFS 구현
- 큐를 이용한다.
- 시작 노드를 큐에 넣고 visited = true 로 설정한다.
- 큐가 빌 때까지 다음을 반복한다.
- 큐에서 맨 앞 노드를 꺼내고, StringBuilder에 저장한다.
- 꺼낸 노드와 인접한 노드 중 방문하지 않은 노드를 큐에 넣고 visited = true 로 설정한다.
💡코드
import java.io.*;
import java.util.*;
public class Main {
static StringBuilder sb = new StringBuilder();
static boolean[] visited;
static int[][] arr;
static int N, M, V;
static Queue<Integer> q = new LinkedList<>();
static void DFS(int v) {
visited[v] = true;
sb.append(v).append(" ");
for(int i=0; i<arr.length; i++) {
if(arr[v][i] == 1 && !visited[i]) {
DFS(i);
}
}
}
static void BFS(int v) {
Queue<Integer> q = new LinkedList<>();
q.offer(v);
visited[v] = true;
while(!q.isEmpty()) {
int current = q.poll();
sb.append(current).append(" ");
for(int i=0; i<arr.length; i++) {
if(arr[current][i] == 1 && !visited[i]) {
q.offer(i);
visited[i] = true;
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
V = Integer.parseInt(st.nextToken());
arr = new int[N+1][N+1];
for(int i=0; i<M; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
arr[x][y] = 1; arr[y][x] = 1;
}
visited = new boolean[N+1];
DFS(V); sb.append("\\n");
visited = new boolean[N+1];
BFS(V);
System.out.println(sb);
br.close();;
}
}
💡시간복잡도
- DFS: $O(N^2)$
- BFS: $O(N^2)$
⇒ 전체 시간복잡도 $O(N^2)$
💡 틀린 이유
그래프를 배열로 받아오는 과정에서 정점이 1부터 시작하는 것을 간과하고 배열 크기를 N으로 설정해서 인덱스 오류가 발생했다.
💡 틀린 부분 수정
배열 크기를 [N+1][N+1] 로 수정했다.
arr = new int[N+1][N+1];
DFS와 BFS 메서드에서 반복문도 1부터 시작하도록 수정했다.
for(int i=1; i<arr.length; i++) {
...
}
💡 느낀점 or 기억할정보
DFS의 개념 정리를 할 때 인접 리스트를 이용해 구현 코드를 작성해서, 이 문제를 해결할 때는 인접 행렬이 더 적절하다는 것을 알아내는데 시간이 걸렸다. 문제마다 주어지는 그래프의 표현 방식이 다르기 때문에 문제에 적잘한 방법을 사용할 수 있도록 익숙해져야 할 것 같다.
반응형
'알고리즘 문제 > 백준' 카테고리의 다른 글
[백준] 11724번: 연결 요소의 개수 (1) | 2024.07.17 |
---|---|
[백준] 2667번: 단지번호붙이기 (0) | 2024.07.16 |
[백준] 9093번: 단어 뒤집기 (1) | 2024.07.16 |
[백준] 1966번: 프린터 큐 (0) | 2024.07.12 |
[백준] 9012번: 괄호 (0) | 2024.07.11 |
댓글