-
[java] 백준 2644 : 촌수계산알고리즘 2023. 5. 2. 11:32
문제
https://www.acmicpc.net/problem/2644
2644번: 촌수계산
사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어
www.acmicpc.net
풀이
DFS
임의로 count를 만들어 dfs를 하기 전 count++를 계속했더니 틀린답이 나왔다 재귀함수 안에 count를 넣어줘야 맞게나옴
package main; import java.util.*; public class Main { static int N; static int M; static int C1; static int C2; static int count=0; static int answer=0; static ArrayList<Integer>[] arr; static boolean[] visited; public static void main(String[] args) { Scanner sc = new Scanner(System.in); N = sc.nextInt(); //전체 사람의 수 C1 = sc.nextInt(); //촌수 계산 1 C2 = sc.nextInt(); //촌수 계산 2 M = sc.nextInt(); //연결 수 visited = new boolean[N+1]; arr = new ArrayList[N+1]; for(int i=1; i<=N; i++) { arr[i] = new ArrayList<Integer>(); } for(int i=1; i<=M; i++) { int x = sc.nextInt(); int y = sc.nextInt(); arr[x].add(y); arr[y].add(x); } //visited[C1]=true; DFS(C1,0); //BFS(); if(visited[C2]==false) System.out.println(-1); else{System.out.println(answer);} } static void DFS(int v,int c) { visited[v]=true; if(v==C2) {answer=c; return;} for(int x:arr[v]) { if(visited[x]==false) { DFS(x,c+1); } } } }
BFS
방문배열이랑 거리배열 둘 다 사용
package main; import java.util.*; public class Main { static int N; static int M; static int C1; static int C2; static int count=0; static int answer=0; static ArrayList<Integer>[] arr; static boolean[] visited; static int[] dis; public static void main(String[] args) { Scanner sc = new Scanner(System.in); N = sc.nextInt(); //전체 사람의 수 C1 = sc.nextInt(); //촌수 계산 1 C2 = sc.nextInt(); //촌수 계산 2 M = sc.nextInt(); //연결 수 dis = new int[N+1]; visited = new boolean[N+1]; arr = new ArrayList[N+1]; for(int i=1; i<=N; i++) { arr[i] = new ArrayList<Integer>(); } for(int i=1; i<=M; i++) { int x = sc.nextInt(); int y = sc.nextInt(); arr[x].add(y); arr[y].add(x); } //visited[C1]=true; //DFS(C1,0); BFS(); if(visited[C2]==false) System.out.println(-1); else{System.out.println(dis[C2]);} } } static void BFS() { Queue<Integer> q = new LinkedList<>(); q.add(C1); visited[C1]=true; while(!q.isEmpty()) { int now = q.poll(); for(int x : arr[now]) { if(visited[x]!=true) { visited[x]=true; dis[x]=dis[now]+1; q.add(x); if(x==C2) {return;} } } } } }
효율적이지 못한 것 같아 거리배열만 사용해도 방문했는지 알 수 있으니까 거리배열만 사용하기로 수정
거리값이 0이면 방문하지 않았으므로 -1출력
package main; import java.util.*; public class Main { static int N; static int M; static int C1; static int C2; static int count=0; static int answer=0; static ArrayList<Integer>[] arr; static boolean[] visited; static int[] dis; public static void main(String[] args) { Scanner sc = new Scanner(System.in); N = sc.nextInt(); //전체 사람의 수 C1 = sc.nextInt(); //촌수 계산 1 C2 = sc.nextInt(); //촌수 계산 2 M = sc.nextInt(); //연결 수 dis = new int[N+1]; visited = new boolean[N+1]; arr = new ArrayList[N+1]; for(int i=1; i<=N; i++) { arr[i] = new ArrayList<Integer>(); } for(int i=1; i<=M; i++) { int x = sc.nextInt(); int y = sc.nextInt(); arr[x].add(y); arr[y].add(x); } //visited[C1]=true; //DFS(C1,0); BFS(); if(dis[C2]==0) System.out.println(-1); else{System.out.println(dis[C2]);} } static void BFS() { Queue<Integer> q = new LinkedList<>(); q.add(C1); while(!q.isEmpty()) { int now = q.poll(); for(int x : arr[now]) { if(dis[x]==0) { dis[x]=dis[now]+1; q.add(x); if(x==C2) {return;} } } } } }
'알고리즘' 카테고리의 다른 글
[java] 백준 1463 : 1로 만들기 (0) 2023.05.04 [java] 백준 1244 스위치 켜고 끄기 (0) 2023.05.03 [java] 백준 2606 : 바이러스 (0) 2023.04.30 [java] 백준 1260 : DFS와 BFS (0) 2023.04.27 [java] 백준 14888 : 연산자 끼워넣기 (0) 2023.04.18