🔍 문제
✏️ 풀이 - Java
처음 출발하는 정점을 고정시켜놓고 정점을 탐색할때마다 출발 정점에서 탐색가능한 정점으로 간주하여 입력으로 들어온 배열에 경로로 갈수 있는 값을 1로 바꿔주었다. bfs는 큐, dfs는 스택을 이용해서 풀어보았는데 bfs가 근소한 차이로 조금 더 빨랐다.
boj사이트에서 이 문제를 가장 빨리 푼 사람의 코드는 내 코드와 비교 했을 때 실행시간이 2배정도 빨랐는데, 입력값으로 들어오는 인접행렬을 boolean값으로 바꿔 이 하나의 2차원 배열을 3중 for문을 돌려서 [0, 1] -> [1, 2] 로 갈 수 있다면 [0, 2]로 갈 수 있는 것으로 간주하여 값을 바꿔주는 식으로 푼 것을 보았다. 크으... 👏👏👏 풀고나서 다른 사람 코드보는 것도 하나의 재미인 것 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
import java.util.StringTokenizer;
public class PathSearch {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()); //n개의 줄
int[][] a = new int[n][n]; //입력값 받기
for(int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 0; j < n; j++) {
a[i][j] = Integer.parseInt(st.nextToken());
}
}
bfs(a, n);
//결과 print
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
System.out.print(a[i][j] + " ");
}
System.out.println();
}
}
//bfs로 풀기 - queue
private static void bfs(int[][] a, int n) {
for(int i = 0; i < n; i++) {
Queue<Integer> q = new LinkedList<>();
boolean[] c = new boolean[n];
q.add(i);
while(!q.isEmpty()) {
int v = q.poll();
for(int j = 0; j < n; j++) {
if(a[v][j] == 1 && !c[j]) {
c[j] = true;
a[i][j] = 1;
q.add(j);
}
}
}
}
}
//dfs로 풀기 - stack
private static void dfs(int[][] a, int n) {
for(int i = 0; i < n; i++) {
Stack<Integer> stack = new Stack<>();
boolean[] c = new boolean[n];
boolean flag = false;
stack.push(i);
while(!stack.isEmpty()) {
int v = stack.peek();
flag = false;
for(int j = 0; j < n; j++) {
if(a[v][j] == 1 && !c[j]) {
stack.push(j);
c[j] = true;
a[i][j] = 1;
flag = true;
break;
}
}
if(!flag) stack.pop();
}
}
}
}