1. 문제
https://www.acmicpc.net/problem/1325
1325번: 효율적인 해킹
첫째 줄에, N과 M이 들어온다. N은 10,000보다 작거나 같은 자연수, M은 100,000보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에 신뢰하는 관계가 A B와 같은 형식으로 들어오며, "A가 B를 신뢰한
www.acmicpc.net
2. 접근방식
dfs, bfs 둘 다 접근 가능한 방법이다. 다만 처음에 방문 배열을 사용하지 않고 접근해서 시간초과가 났다.
방문배열을 사용해야 하는 이유는 다음과 같다.
1 4
3 2
3 1
4 3
1 - 4 - 3 이 순환을 하며 계속 다음 노드를 탐색하기 때문이다.
사실 이 부분이 시간초과를 뜨게한 주 원인인지는 확실하지 않다. 이런 식으로 순환을 하면 스택오버플로우 오류가 뜨는게 타당한 것 같은데 해당 오류가 뜨지 않아서 다른 이유 일수도 있다고 생각한다.
어쨌든 dfs,bfs 둘 다 사용가능하고 방문배열을 유의해서 사용하면 된다.
3. 구현
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
static int N,M;
static List<Integer>[] computers;
static int max;
static int[] result;
static boolean[] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
computers = new ArrayList[N+1];
result = new int[N+1];
visited = new boolean[N+1];
for (int i=1; i<=N; i++) {
computers[i] = new ArrayList<Integer>();
}
for (int i=0; i<M; i++) {
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
computers[start].add(end);
}
for (int i=1; i<=N; i++) {
visited = new boolean[N+1];
dfs(i);
}
for (int i=1; i<=N; i++) {
if (max < result[i]) {
max = result[i];
}
}
StringBuffer sb = new StringBuffer();
for (int i=1; i<=N; i++) {
if (max == result[i]) {
sb.append(i+" ");
}
}
System.out.println(sb.toString());
}
public static void dfs(int idx) {
visited[idx] = true;
for (int computer : computers[idx]) {
if (!visited[computer]) {
result[computer]++;
dfs(computer);
}
}
}
}
4. 정리
나를 포함한 대부분이 dfs 또는 bfs의 전형적인 방식을 사용해서 문제를 해결했다. 대개 7500ms ~ 11000ms로 통과한듯 하다. 하지만 아래 두 링크의 결과를 보면 2500ms ~ 3500ms로 문제해결을 한다. 사실 잠깐 들여다보긴 했지만 정확하게 코드를 이해하지 못했다. 추후 시간이 되면 해당 코드들을 분석해서 어떻게 시간을 3분의1로 단축했는지 파악해보자.
'백준' 카테고리의 다른 글
백준 1717번 자바 (0) | 2023.03.17 |
---|---|
백준 1707번 자바 (0) | 2023.03.09 |
백준 18352번 자바 (0) | 2023.03.04 |
백준 1934번 자바 (0) | 2023.02.24 |
백준 11689번 자바 (0) | 2023.02.22 |