1번에서 2번으로 간다고했을때
1 -> 3 -> 4 -> 6 -> 2 // 4번 이동
1 -> 4 -> 6 -> 2 // 3번 이동
위 두 가지의 방법으로 2에 도달할 수 있다. 최소 이동 간선수는 3이 될 것이다.
입력:
첫째 줄에는 정점의 수 N(1<=N<=20)와 간선의 수 M가 주어진다. 그 다음부터 M줄에 걸쳐 연 결정보가 주어진다.
해를 구하는 과정에서 인접행렬을 사용할 수 있지만
출력:
1번 정점에서 각 정점으로 가는 최소 간선수를 2번 정점부터 차례대로 출력하세요.
풀이:
해를 구하는 과정에서 인접행렬을 사용할 수도 있지만 n이 커지면 2차원 배열 크기가 너무 커지기 때문에 메모리 낭비가
있을 수 있어서 인접 리스트 방식으로 풀었다.
graph라는 이름의 리스트를 여러개를 사용해야 하기때문에 초기화 하는 코드부분에서 낯설었고 다음날 다시 풀어보려고 하니
생각이 잘 나지 않았다.
static ArrayList<ArrayList <Integer>> graph = new ArrayList<ArrayList<Integer>>();
위와 같이 선언 및 초기화를 해줘야 하며, 만약 정점이 6개면 1~6 까지 리스트를 만들어줘야한다
for(int i=0;i<=6;i++){
graph.add(new ArrayList<Integer>());
}
입력이 다 끝나면 루트 정점이 1 이기 때문에
BFS(1); 을 메인에서 호출한다
ch[] : 방문한 노드 체크하는 배열
dis[] : 각 노드의 최소 이동 간선 수를 담는 배열
public void BFS(int v){
//1에서 각 정점으로 가는 최소 간선 수를 구해라
ch[v]=1;// 방문한걸로 처리
dis[v]=0; // 거리 초기화
//BFS이기 때문에 큐를 사용
Queue<Integer>Q = new LinkedList<>();
Q.offer(v);
while (!Q.isEmpty()){
int cv = Q.poll();
for(int nv : graph.get(cv)){
if(ch[nv]==0){
ch[nv]=1;
Q.offer(nv);
dis[nv]= dis[cv]+1; //핵심
}
}
}
}
위 코드에서
dis[nv]= dis[cv]+1;
이 코드가 핵심인거 같다. 결국 노드가 이어져있기 때문에
1 -> 4 -> 6 노드로 이동한다고 했을때
1 -> 4 는 1만큼 이동되고 4 - > 6 이 이어져있기 때문에 1 -> 4 -> 6 으로 이동하는데에도
아래와 같이 이해하면 되는것이다.
1 -> 4 -> 6 의 이동거리 = 1 (1->4) + 1
출처: 인프런 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 - 김태원
'알고리즘 > 문제풀이' 카테고리의 다른 글
프로그래머스 - 베스트앨범 (Java) 풀이 및 코드 (0) | 2024.04.01 |
---|---|
다익스트라 알고리즘 기본 문제(각 정점의 최소 거리비용 출력)풀이 (2) | 2024.03.26 |
바둑이 승차 문제 (DFS) - Java (0) | 2024.02.26 |
프로그래머스[폰켓몬] 정답 - Java (0) | 2024.02.21 |
뮤직비디오 문제 (결정알고리즘) 풀이 (0) | 2024.02.20 |