문제 내용은 입력으로 정점, 간선, 시작 위치를 받아, 인접 정점을 오름차순으로 방문하되, 출력은 방문한 값이 아니라, 값별 방문한 순서를 찍어줘야 하는데, 방문하지 못한 값은 0을 출력해주면 된다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
public class Main {
static Map<Integer, ArrayList<Integer>> graph = new HashMap<>();
static int[] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] split = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
for (int i = 0; i < split[1]; i++) {
int[] vertex = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
graph.putIfAbsent(vertex[0], new ArrayList<>());
graph.putIfAbsent(vertex[1], new ArrayList<>());
graph.get(vertex[0]).add(vertex[1]);
graph.get(vertex[1]).add(vertex[0]); // 양방향
}
for (ArrayList<Integer> nodes : graph.values()) {
Collections.sort(nodes);
}
visited = new int[split[0] + 1];
bfs(split[2]);
for (int i = 1; i < visited.length; i++) {
System.out.println(visited[i]);
}
}
public static void bfs(int start) {
Queue<Integer> queue = new LinkedList<>();
queue.add(start);
int cnt = 1;
visited[start] = cnt++;
while (!queue.isEmpty()) {
Integer poll = queue.poll();
for (int neighbor : graph.get(poll)) {
if (visited[neighbor] != 0) {
continue;
}
queue.add(neighbor);
visited[neighbor] = cnt++;
}
}
}
}
문제는 결국 BFS로 풀라고 하기 때문에, BFS로 풀어줘야 하는데, 주의할 점은 오름차순으로 방문해야 하므로, graph를 구성하고 난 뒤 인접 정점을 오름차순으로 정렬해주고, 이후 bfs를 돌려줘야 하는데
이후 출력할 정답은 방문한 값이 아니라, 값별 방문한 순서이기 때문에, cnt를 1씩 올려가면서 방문한 순서를 visited 배열에 값별 위치에 꽂아주는 식으로 진행한 후
visited 배열을 1부터 시작해서 (0은 정점에 없음) 끝까지 돌려준 후 방문한 순서들을 출력해주면 끝이다.
Leave a Reply