////
Search
Duplicate
💯

백준 2644(그래프 탐색/DFS)(JAVA 자바)

생성일
2022/11/10 13:29
태그

코드

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.StringTokenizer; /* * 문제 주소 : https://www.acmicpc.net/problem/2644 * * 문제 접근 방법 & 사용 알고리즘: DFS 사용이유? 코드가 짧을거 같아서? bfs써서 풀어도 될듯 최단거리이기 때문에 * 부모 자식의 관계를 간선, 사람을 정점 으로 보고 양방향 간선, 정점 만들어서 dfs풀이 * */ public class dfs_bfs_2644 { static int n; // 전체 사람의 수 static int person1, person2; // 계산 해야하는 서로 다른 두사람 static int m; // 부모 자식의 관계 static int[][] relation; static int min = 100; static ArrayList<Integer>visited = new ArrayList<>(); public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); n = Integer.parseInt(br.readLine()); StringTokenizer st = new StringTokenizer(br.readLine()); person1 = Integer.parseInt(st.nextToken()); person2 = Integer.parseInt(st.nextToken()); m = Integer.parseInt(br.readLine()); relation = new int[101][101]; for(int i=0;i<m;i++){ st = new StringTokenizer(br.readLine()); int x = Integer.parseInt(st.nextToken()); int y = Integer.parseInt(st.nextToken()); relation[x][y] = relation[y][x] = 1; } int result = person1 > person2 ? dfs(person2,0) : dfs(person1,0); if(result == -1&&min==100) min = result; System.out.println(min); } public static int dfs(int person,int length){ int goalPerson = person1 > person2 ? person1:person2; if(goalPerson==person){ if(min>length) min = length; return min; } visited.add(person); for(int i=1;i<n+1;i++){ if(!visited.contains(i)&&i!=person&&relation[person][i]==1){ dfs(i,length+1); } if(person==n&&i==n){ return -1; } } return -1; } }
Java
복사
햇갈렸던 부분 : 처음에 최소 경로 구하는 부분이 이해가 가지 않았다. min 값이 어떻게 최소 값이 될 수 있을까 생각해보다가 처음부터 끝까지 디버깅 하면서 알게 되었다.
최종 목적지까지 가게 될때 재귀함수로 인해 쌓이는 스택은 최단 경로만을 나타낸다는것을… 머리가 안좋으니 계속 디버깅 해볼 수 밖에 없을 것 같다.
풀이법 : 부모 자식간의 관계를 양방향 간선, 사람들을 정점으로 나타낸다. 방문한 사람은 visited 리스트에 넣고 간선이 있으면 재귀 → 목표 사람에 도착하면 min 값 지정( 지정할 때 이번턴 전에 갱신됬던 min 값과 비교해서 최소값을 찾음. min 초기값은 100 → 최악의 경우 100촌이기 때문에)