본문 바로가기
코딩테스트

[백준] 1325번 '효율적인 해킹' - Java

by CuckooBird 2024. 8. 22.

https://www.acmicpc.net/problem/1325


문제


풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
import java.util.StringTokenizer;

public class Main {
	static boolean[] visited;
	static ArrayList<Integer>[] matrix;
	static int[] cnt;
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		int n = Integer.valueOf(st.nextToken());
		int m = Integer.valueOf(st.nextToken());
		
		matrix=new ArrayList[n+1];
		cnt = new int[n+1];
		
		for (int i = 1; i <= n; i++) {
		    matrix[i] = new ArrayList<Integer>();
		}
		
		for(int i=0; i<m; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			
			int a = Integer.valueOf(st.nextToken());
			int b = Integer.valueOf(st.nextToken());
			
			matrix[a].add(b);
		}
		
		for(int i=1;i<=n;i++) {
			visited = new boolean[n+1];
			BFS(i);
		}
		
		int max=0;
		for(int i=1;i<=n;i++) {
			max = Math.max(max, cnt[i]);
		}
		
		for(int i=1;i<=n;i++) {
			if(max == cnt[i]) System.out.print(i + " ");
		}
		
	}	
	
	public static void BFS(int i) {
		Queue<Integer> q = new LinkedList<>();
		q.offer(i);
		visited[i] = true;
		
		while(!q.isEmpty()) {
			int curr=q.poll();
			for(int idx: matrix[curr]) {
				if(!visited[idx]) {
					visited[idx]=true;
					q.offer(idx);
					cnt[idx]++;
				}
			}
		}
	}
}

회고

어떻게 해도 메모리초과, 시간초과가 나길래 다른 분들의 풀이를 봤는데, 낼 때마다 정답과 오답이 달라진다고 하더라고요. 무슨 그런 거짓말이 다있어~ 하면서 혹시나 하는 마음에 똑같은 코드를 다시 제출했더니.. 하.. 진짜.. 뭔 이런...

웬만한 그래프 탐색 문제는 BFS, DFS 방법 모두로 구현해보려고 했는데 이건 너무 피곤해서 그만 뒀습니다.. ㅋㅋ 지치는 문제네요.. DFS는 큐를 스택으로만 바꾸면 되니깐요..