1325번: 효율적인 해킹 [JAVA]_DFS, BFS
https://www.acmicpc.net/problem/1325
1325번: 효율적인 해킹
첫째 줄에, N과 M이 들어온다. N은 10,000보다 작거나 같은 자연수, M은 100,000보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에 신뢰하는 관계가 A B와 같은 형식으로 들어오며, "A가 B를 신뢰한
www.acmicpc.net
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
시간초과 진짜...ㅠ.ㅠ 될 때까지 했다 휴ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
🔔 시간 조금이라도 줄이기
1) 귀찮아서 import 문 작성할 때 그냥 *로 다 불러왔는데 따로 작성하는게 시간을 조금 줄일 수 있었다.
import java.util.*; import java.io.*; → 필요한 것만
2) Scanner → BufferedReader & StringTokenizer
System.out.println() → StringBuilder() 또는 BufferedWriter
접근 방식)
B를 해킹하면, A를 해킹할 수 있는 것이기에 단방향으로만 노드 추가
result라는 신뢰도 배열 만들어서, DFS/BFS 돌면서 해킹할 수 있는 컴퓨터 수 추가해준다.
DFS/BFS 완료했으면, result 배열 돌면서, 가장 많은 컴퓨터 해킹할 수 있는 max 값 찾고
해당 컴퓨터 번호 오름차순으로 출력
- DFS
package tony_git.graph_traversal;
import java.io.*;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class B_1325_DFS {
static int N, M;
static ArrayList<Integer>[] A;
static boolean[] visited;
static int[] result;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
A = new ArrayList[N + 1];
result = new int[N + 1];
for (int i = 1; i <= N; i++)
A[i] = new ArrayList<>();
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
A[s].add(e);
}
for (int i = 1; i <= N; i++) {
visited = new boolean[N + 1];
DFS(i);
}
int max = Integer.MIN_VALUE;
for (int i = 1; i <= N; i++)
max = Math.max(max, result[i]);
for (int i = 1; i <= N; i++) {
if (result[i] == max)
bw.write(i + " ");
}
bw.flush();
bw.close();
}
static void DFS(int node) {
visited[node] = true;
for (int i : A[node]) {
if (!visited[i]) {
result[i]++;
DFS(i);
}
}
}
}
- BFS
package tony_git.graph_traversal;
import java.io.*;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class B_1325_BFS {
static int N, M;
static ArrayList<Integer>[] A;
static boolean[] visited;
static int[] result;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
A = new ArrayList[N + 1];
result = new int[N + 1];
for (int i = 1; i <= N; i++)
A[i] = new ArrayList<>();
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
A[s].add(e);
}
for (int i = 1; i <= N; i++) {
visited = new boolean[N + 1];
BFS(i);
}
int max = Integer.MIN_VALUE;
for (int i = 1; i <= N; i++)
max = Math.max(max, result[i]);
for (int i = 1; i <= N; i++) {
if (max == result[i])
bw.write(i + " ");
}
bw.flush();
bw.close();
}
static void BFS(int node) {
Queue<Integer> queue = new LinkedList<>();
queue.add(node);
visited[node] = true;
while (!queue.isEmpty()) {
int now = queue.poll();
for (int i : A[now]) {
if (!visited[i]) {
queue.add(i);
visited[i] = true;
result[i]++;
}
}
}
}
}
+) 참고
https://hyeounstory.tistory.com/174
백준 : 1325 (효율적인 해킹) (DFS)
이번문제는 간단한 DFS로 풀수 있는 문제였습니다. 다만, 시간초과 이슈로 계속 틀려 찾아보고 여러가지 수정하여 정답이 맞았으나.. 맞은 정답의 원인을 찾고자 다시 맞은답을 실행해 보니... 틀
hyeounstory.tistory.com
https://minhamina.tistory.com/111
[백준 - Java] 1325번 : 효율적인 해킹 (자바는 시간초과!!!!)
문제 www.acmicpc.net/problem/1325 1번 정점으로 5번 정점은 해킹될 수 있다. 5번 정점을 시작으로 dfs를 돌면서 인접한 2번 정점에 들렸다. -> 2번 정점으로 5번 정점은 해킹될 수 있다. public static void dfs(int
minhamina.tistory.com