코딩테스트/프로그래머스
[코딩테스트] Java 가장 먼 노드
[dev] hiro
2024. 11. 28. 00:59
제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
Programmers 알고리즘 고득점 Kit입니다.
포인트
bfs 탐색을 통해 1번 노드에서 가장 먼 노드를 찾는 문제였습니다. 저는 visited 배열과 step 배열을 통해서 문제를 풀었습니다.
소스코드
import java.util.*;
class Solution {
boolean[] visited;
int[] step;
List<List<Integer>> graph = new ArrayList<>();
Queue<Integer> q = new LinkedList<>();
public void bfs() {
while(!q.isEmpty()) {
int src = q.poll();
for(int desc: graph.get(src)) {
if (!visited[desc]) {
visited[desc] = true;
step[desc] = step[src] + 1;
q.add(desc);
}
}
}
}
public void init(int n) {
visited = new boolean[n + 1];
step = new int[n + 1];
for (int i = 0; i <= n; i++) {
graph.add(new ArrayList<>());
}
q.add(1);
visited[1] = true;
step[1] = 1;
}
public int solution(int n, int[][] edge) {
int answer = 1;
init(n);
for(int[] vertex: edge) {
int src = vertex[0];
int desc = vertex[1];
graph.get(src).add(desc);
graph.get(desc).add(src);
}
bfs();
Arrays.sort(step);
int max = Integer.MIN_VALUE;
for(int i = 1; i <= n; i++) {
if (max < step[i]) {
answer = 1;
max = Math.max(max, step[i]);
} else if (max == step[i]) {
answer++;
}
}
return answer;
}
}
코드 설명
- 변수 설명
- boolean[] visited
해당 인덱스의 노드를 방문했는지 확인하는 배열입니다. - int[] step
해당 인덱스의 노드의 그래프의 깊이 입니다. - List<List<Integer>> graph = new ArrayList<>()
src와 desc로 설정하여 graph를 설정합니다. - Queue<Integer> q = new LinkedList<>()
bfs 를 위한 Queue를 선언합니다.
- boolean[] visited
- bfs 메소드
일반 bfs 메소드입니다.- src와 desc를 선언하여 방문하지 않은 desc면 q에 넣고 step도 초기화합니다.
- init 메소드
변수들을 초기화하는 메소드입니다.
Arrays.sort(step);
int max = Integer.MIN_VALUE;
for(int i = 1; i <= n; i++) {
if (max < step[i]) {
answer = 1;
max = Math.max(max, step[i]);
} else if (max == step[i]) {
answer++;
}
}
return answer;
- 몇번 인덱스를 찾는 문제가 아니라 가장 먼 노드의 갯수를 구하는 문제이므로 Array를 정렬합니다.
- step이 가장 큰 노드를 찾으면 answer를 초기화 합니다.
- max와 step[i]가 같으면 answer을 1 증가합니다.
- 반복문 종료 후 answer를 반환합니다.