Algorithm
[백준] 1976: 여행 가자 JAVA
하다보면 되겠지
2025. 3. 1. 23:15
접근
바로 이전 게시글에서 풀었던 경로 찾기 문제와 매우 유사하다. 여행 동선을 체크할 때 중간에 여러 도시를 지나가도 되고 동일한 도시를 여러 번 방문해도 된다는 얘기는, 결국 A > B 도시로 이동 가능한 경로가 있는가만 확인하면 된다. 어차피 양방향 그래프이기 때문에 나는 스택에 저장해두고 뒤쪽 도시부터 반대 방향으로 확인했다.
처음에 75%에서 틀렸다는 결과가 나왔는데, 질문 게시판에서 반례를 찾았다. 여행 계획이 A > A, 즉 같은 도시로 이동할 수도 있는거다. 문제에서 연결 정보를 입력받을 때에는 같은 도시에 대한 정보는 포함되어 있지 않으므로 이 부분이 누락됐던 것 같다. 그래서 if(i == j) graph[i][j] = 1 조건을 추가해주었다.
코드
import java.util.*;
import java.lang.*;
import java.io.*;
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
// 입력값 저장
int n = Integer.parseInt(br.readLine());
int m = Integer.parseInt(br.readLine());
int[][] graph = new int[n+1][n+1];
for(int i = 1;i <= n;i++){
st = new StringTokenizer(br.readLine());
for(int j = 1;j <= n;j++){
graph[i][j] = Integer.parseInt(st.nextToken());
if(i == j) graph[i][j] = 1;
}
}
// 여행 계획
st = new StringTokenizer(br.readLine());
Queue<Integer> q = new LinkedList();
while(st.hasMoreTokens()){
int cur = Integer.parseInt(st.nextToken());
q.add(cur);
}
// 플로이드 워셜 알고리즘
solve(graph, n);
// 결과 출력
Boolean possible = true;
int cur = q.poll();
while(!q.isEmpty()){
int next = q.poll();
if(graph[cur][next] == 0){
possible = false;
break;
}
cur = next;
}
String answer = possible ? "YES" : "NO";
System.out.println(answer);
}
static void solve(int[][] graph, int n){
for(int k = 1;k <= n;k++){
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
if(graph[i][k] == 0 || graph[k][j] == 0) continue; // 양수 길이 없음
graph[i][j] = 1;
}
}
}
}
}