728x90
반응형
문제 파악
- 출발점 X에서 특정 거리 K가 걸리는 노드들을 체크하고 마지막에 출력해주기
<알고리즘 분류>
-BFS
접근 방법
-BFS사용해 최단 거리 카운트하기
-출발점은 하나이고 단일로 연결 된 노드를 타고 가서 거리를 카운트
-거리는 모두 1로 통일(별도의 가중치 없음 파악)
-visited를 int[]로 변형 활용하여(토마토 문제처럼) 노드마다 '출발점에서 얼마나 걸렸는지' 적재해주기
코드 구현
package org.server;
import java.io.*;
import java.util.*;
public class Main {
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());
int M = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int X = Integer.parseInt(st.nextToken());
ArrayList<Integer>[] graph = new ArrayList[N+1];
//System.out.println(K);
for(int i=1;i<=N;i++){
graph[i] = new ArrayList<>();
}
for(int j=0;j<M;j++){
st = new StringTokenizer(br.readLine());
int fromNode = Integer.parseInt(st.nextToken());
int toNode = Integer.parseInt(st.nextToken());
graph[fromNode].add(toNode);//단방향
}
int[] visited = new int[N+1];
Arrays.fill(visited, -1);//미방문 체크 위해 -1로 초기화
ArrayDeque<Integer> que = new ArrayDeque<>();
ArrayList<Integer> answer = new ArrayList<>();
que.add(X);
visited[X]=0;//가장 처음 출발지점은 0으로 초기화 -> 타고타고 갈거라서 여기서만 하면 됨
while (!que.isEmpty()) {
int curr = que.poll();
for(int next:graph[curr]){
if(visited[next]==-1){
que.add(next);
visited[next]=visited[curr]+1;//포인트
}
}
}
for(int i=1;i<=N;i++){
if(visited[i]==K){
answer.add(i);
}
}
if(answer.size()==0){
System.out.println(-1);
}else{
Collections.sort(answer);
for(int x:answer){
System.out.println(x);
}
}
}
}
배우게 된 점
-visited[next] = visited[curr]+1 //현재보다 한 칸 더 간 것을 이렇게 체크해준다.
-풀이를 좀 찾아봤는데, 푸는 방법은 제 각기고 자율의 영역임을 배움
반응형
'alorithm > Baekjoon' 카테고리의 다른 글
[백준] 2468번: 안전 영역 (0) | 2025.03.19 |
---|---|
[백준] 5567번: 결혼식 (1) | 2025.03.18 |
[백준] 5014번: 스타트링크 (3) | 2024.09.07 |
[백준] 1697번: 숨바꼭질 (0) | 2024.09.06 |
[백준] 2648번 : 안전 영역 (2) | 2024.09.02 |