인접 리스트를 만들고 BFS
로 퍼져나가면서 단순히 방문 여부만 체크하는 것이 아니라 언제 방문했는지를 체크해줌으로써 풀 수 있는 문제입니다.
인접 리스트를 구현하는 방법에는 크게 2차원 배열을 이용하거나 연결 리스트를 이용할 수 있는데, 이 문제는 정점의 최대 개수가 101개(1~100)이기 때문에 이번에는 오랜만에 간단히 배열을 사용해서 만들어 보아씀니다.
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Solution {
static int [][] graph;
static int[] dy = {0, 0, 1, -1};
static int[] dx = {1, -1, 0, 0};
static int bfs(int start) {
int [] visited = new int[101];
int maxCnt = 0, ans = 0;
Queue<Integer> q = new LinkedList<>();
q.offer(start);
visited[start] = 1;
while(!q.isEmpty()) {
int cur = q.poll();
for(int i = 1; i< 101; i++) {
if(graph[cur][i] != 1 || visited[i] != 0) continue;
visited[i] = visited[cur]+1;
q.offer(i);
}
maxCnt = visited[cur];
}
for(int i = 1 ; i< 101; i++) {
if(maxCnt != visited[i]) continue;
ans = ans > i ? ans : i;
}
return ans;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = 10;
for(int test_case= 1; test_case <= T; test_case++) {
int N = sc.nextInt();
int start = sc.nextInt();
graph = new int[101][101];
for(int i = 0; i < N/2; i++)
graph[sc.nextInt()][sc.nextInt()] = 1;
System.out.println("#" + test_case + " " + bfs(start));
}
}
}
문제를 보면 방향이 있는 그래프라는것을 알 수 있습니다. 무식하게 101 x 101 배열을 만들고
이런 경우에 graph[11][6]
을 1로 만들어 줍니다.
2차원 배열로 그래프를 만들고 나면 시작지점부터 bfs
를 돌려 줍니다. 이 때, visited
배열을 두어 각 인덱스 번호에 해당하는 정점에 몇 번만에 방문했는지를 저장해줍니다.
최대 방문횟수를 저장해서 101번 돌면서 최대 방문 횟수와 같으면서 가장 큰 친구를 찾아주면 끝입니다.
1부터 100까지 보기 때문에 그냥 반복문돌면서 바로 업데이트해줘도 되겠네여.
이 문제는 정점의 수가 100개라서 무난히 통과하는디 정점의 수가 어마어마하게 많으면 굉장히 비효율적입니다.
고로 ArrayList
씁시다.
감사함니당 6.6
'Algorithm > SWEA' 카테고리의 다른 글
[SWEA-1251][MST/Prim] 하나로 - Java (0) | 2020.09.03 |
---|---|
[SWEA-3234][백트래킹] 준환이의 양팔저울 - Java (0) | 2020.08.28 |
[SWEA-9229][DFS] 한빈이와 Spot Mart - Java (0) | 2020.08.03 |
[SWEA-1223][스택] 계산기2 - Java (0) | 2020.08.02 |
[SWEA-1225][큐] 암호생성기 - Java (0) | 2020.07.30 |