Notice
Recent Posts
Recent Comments
Link
개발자-H 입니다.
프로그래머스 - 가장 먼 노드 본문
https://programmers.co.kr/learn/courses/30/lessons/49189
코딩테스트 연습 - 가장 먼 노드
6 [[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]] 3
programmers.co.kr
- 가장 먼 노드의 갯수를 출력해야 하기 때문에 모든 노드를 방문해야지 풀 수 있다.
- 노드 방문 시 해당 노드의 깊이와 최대 깊이를 비교
- 모든 노드 방문 후 최대 깊이로 노드 개수 출력
- BFS와 인접 리스트를 활용하여 문제를 풀었음.
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.stream.Collectors;
class Solution {
private boolean[] visited;
private ArrayList<Integer>[] adj;
public int solution(int n, int[][] edge) {
//초기화
visited = new boolean[n + 1];
adj = new ArrayList[n + 1];
for (int i = 1; i <= n; i++) {
adj[i] = new ArrayList<>();
}
for (int i = 0; i < edge.length; i++) {
int origin = edge[i][0];
int dest = edge[i][1];
adj[origin].add(dest);
adj[dest].add(origin);
}
Queue<State> bfs = new LinkedList<>();
bfs.add(new State(1, 1));
List<State> visitedNode = new ArrayList<>();
int maxDepth = -1;
while (!bfs.isEmpty()) {
State currentNode = bfs.poll();
if (visited[currentNode.nodeIndex]) continue;
visited[currentNode.nodeIndex] = true;
visitedNode.add(currentNode);
//노드 방문 시 깊이와 최대 깊이 정보를 비교하여 갱신
if (currentNode.depth > maxDepth) {
maxDepth = currentNode.depth;
}
for (int i = 0; i < adj[currentNode.nodeIndex].size(); i++) {
bfs.add(new State(adj[currentNode.nodeIndex].get(i), currentNode.depth + 1));
}
}
final int max = maxDepth;
int maxLengthCount = visitedNode.stream().filter(node -> node.depth == max).collect(Collectors.toList()).size();
return maxLengthCount;
}
}
//방문 노드의 정보를 저장
class State {
public final int nodeIndex;
public final int depth;
public State(int nodeIndex, int depth) {
this.nodeIndex = nodeIndex;
this.depth = depth;
}
}
'Algorithm > 문제 풀이' 카테고리의 다른 글
구름 - 길찾기 (다이아몬드) (0) | 2021.08.08 |
---|---|
LeetCode - FloodFile (0) | 2021.08.07 |
BOJ - 섬의 개수 (4963) (0) | 2021.08.07 |
BOJ - 단지번호붙이기 (2667) (0) | 2021.08.07 |
BOJ - 연결 요소의 개수 (11724) (0) | 2021.08.07 |
Comments