- 문제
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
- 풀이
import java.util.*;
class Solution {
public int solution(int n, int[][] edge) {
//답의 개수를 담아줄 answer입니다.
int answer = 0;
//각 노드가 이동할 수 있는 노드들을 담는 ArrayList<>를 생성합니다.
ArrayList<ArrayList<Integer>> check = new ArrayList<>();
//각각 노드의 틀을 만들어줍니다.
for(int i=0; i<=n; i++){
check.add(new ArrayList<>());
}
//이제 입력으로 주어진 edge를 순회하며 각 노드간의 연결관계를 기록해줍니다.
for(int i=0; i<edge.length; i++){
//이번 i의 노드를 연결을 가져옵니다.
int[] now = edge[i];
//노드는 양방향의 연결관계이므로 앞뒤를 바꾸어 입력해줍니다.
check.get(now[0]).add(now[1]);
check.get(now[1]).add(now[0]);
}
//1과의 거리를 기록할 int[]배열 len을 선언합니다.
int[] len = new int[n+1];
//int[] 배열이 초기화되는 0을 이용해서 방문 여부를 검사하고 값을 넣어줄 예정이라
//에러가 발생하지 않게 시작점 1에는 -1을 넣어줍니다.
len[1] = -1;
//이제 BFS 탐색을 하는데 사용할 Queue 자료구조 q를 선언합니다.
Queue<Integer> q = new LinkedList<>();
//1번 노드에서 갈 수 있는 노드들을 찾아서 q에 입력해줍니다.
//한 번에 갈 수 있는 노드들이므로 모두 1의 거리로 표시해줍니다.
for(int a : check.get(1)){
q.add(a);
len[a] = 1;
}
//거리를 표시할 idx 변수를 선언합니다.
int idx = 1;
//while을 통해 bfs를 진행합니다.
while(!q.isEmpty()){
//이번에 나오는 노드들의 거리는 idx 입니다.
idx++;
//이번 while문에서 나오는 노드들은 1로부터 모두 같은 거리를 가집니다.
int size = q.size();
//Queue에서 size만큼만 꺼내서 탐색해줍니다.
for(int i=0; i<size; i++){
int now = q.poll();
//now 노드에서 갈 수 있는 노드들 a를 확인해줍니다.
for(int a : check.get(now)){
//만약 아직 도달한 적이 없을 경우
//해당 노드에는 idx 거리만큼 떨어져있다고 볼 수 있습니다.
//그리고 다시 q를 다음 탐색을 대비합니다.
if(len[a]==0){
len[a] = idx;
q.add(a);
}
}
}
}
//while이 끝나는 마지막 반복에는 아무 노드도 없다는 의미
//즉 이전 while 탐색의 거리가 가장 멀리 떨어진 노드의 거리입니다.
//따라서 -1을 해줍니다.
idx--;
//이제 각 노드들을 순회하며 1에서 해당 노드까지의 거리를 확인하며
//최대 거리인 idx와 같을 경우 answer을 추가해줍니다.
for(int i=2; i<=n; i++){
if(idx==len[i]) answer++;
}
//답을 반환합니다.
return answer;
}
}
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스] 2 x n 타일링, java (0) | 2025.02.16 |
---|---|
[프로그래머스] 합승 택시 요금, java (0) | 2025.02.08 |
[프로그래머스] 숫자 변환하기, java (0) | 2025.02.05 |
[프로그래머스] 택배상자, java (0) | 2025.02.04 |
[프로그래머스] 주식가격, java (0) | 2025.02.03 |