11월 17일(금) - 그래프와 순회 (2644번)
2644번: 촌수계산
사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어
www.acmicpc.net
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
문제점
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
풀이 - 1
(dfs 풀이출처 -> https://eijun.tistory.com/273 )
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int N,from,to,result = -1;
static boolean[][] map;
static boolean[] visited;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
from = Integer.parseInt(st.nextToken());
to = Integer.parseInt(st.nextToken());
map = new boolean[N+1][N+1];
int M = Integer.parseInt(br.readLine());
for(int i=0; i<M; i++)
{
st = new StringTokenizer(br.readLine());
int v1 = Integer.parseInt(st.nextToken());
int v2 = Integer.parseInt(st.nextToken());
map[v1][v2] = map[v2][v1] = true;
}
visited = new boolean[N+1];
dfs(from, 0);
System.out.println(result);
}
private static void dfs(int p, int d){
visited[p] = true;
if(p == to)
{
result = d;
return;
}
for(int i=1; i<=N; i++)
{
if(map[p][i] && !visited[i])
{
dfs(i, d+1);
}
}
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
풀이 - 2
(bfs 풀이출처 -> https://velog.io/@topqr123q/백준-2644번-자바 )
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int N,from,to,result = -1;
static int[][] map;
static boolean[] visited;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
map = new int[N+1][N+1];
visited = new boolean[N+1];
st = new StringTokenizer(br.readLine());
from = Integer.parseInt(st.nextToken());
to = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
int M = Integer.parseInt(st.nextToken());
for(int i=0; i<M; i++)
{
st = new StringTokenizer(br.readLine());
int v1 = Integer.parseInt(st.nextToken());
int v2 = Integer.parseInt(st.nextToken());
map[v1][v2] = map[v2][v1] = 1;
}
System.out.println(bfs(from,to));
}
static int bfs(int p1, int p2){
int result = 0;
Queue<Integer> q = new LinkedList<>();
q.add(p1);
while (!q.isEmpty())
{
int size = q.size();
for(int i=0; i<size; i++)
{
int cur = q.poll();
visited[cur] = true;
if(cur == p2)
{
return result;
}
for(int child=1; child<=N; child++)
{
if(map[cur][child] == 1)
{
if(!visited[child])
{
q.add(child);
}
}
}
}
result++;
}
return -1;
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
'백준(Java) > 23년 11월' 카테고리의 다른 글
[Java] 백준 - 1043번: 거짓말 (0) | 2023.11.21 |
---|---|
[Java] 백준 - 1520번: 내리막 길 (0) | 2023.11.20 |
[Java] 백준 - 15686번: 치킨 배달 (0) | 2023.11.16 |
[Java] 백준 - 1700번: 멀티탭 스케줄링 (0) | 2023.11.15 |
[Java] 백준 - 1976번: 여행 가자 (0) | 2023.11.14 |
댓글