풀이방법 및 문제점
2022.05.28
자바로 시간초과를 안 내기가 매우 매우 어려운 문제다.
난 최선을 다했다...따흐흑
다른 언어로 시도한 사람들은 나와 똑같은 알고리즘으로도 성공했다.
자바로 시도한 다른 사람들은 동일한 코드를 여러 번 제출했더니 한 번은 시간초과, 한 번은 통과가 된다고 한다ㅋㅋㅋㅋㅋㅋㅋㅋ굉장히 빡빡한가 보다.
시간을 줄일 기발한 알고리즘이 떠오르지 않는 한, C++ 또는 Python으로 나중에 도전하는 것이 낫겠다.
코드
Java(2022.05.28)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static ArrayList<Integer>[] arr; //신뢰관계 정보 저장용 ArrayList 배열
static boolean[] visited; //방문여부 저장용 배열
static int[] answer; //컴퓨터별 해킹할 수 있는 컴퓨터의 수
static void dfs(int start, int cur) {
if(visited[cur]) return;
visited[cur] = true;
answer[start]++;
for(int i: arr[cur])dfs(start, i);
}
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
//n과 m 읽어오기
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
//필요한 변수들 선언 및 초기화
arr = new ArrayList[n+1];
for(int i = 1; i<n+1; i++) arr[i] = new ArrayList<Integer>();
visited = new boolean[n+1];
int max = -1;
answer = new int[n+1];
//신뢰관계를 읽어와 저장
for(int i = 0; i<m; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
arr[b].add(a);
}
//깊이우선탐색 수행
for(int i = 1; i<n+1; i++) {
Arrays.fill(visited,false);
dfs(i, i);
max = Math.max(max, answer[i]);
}
//정답 출력
StringBuilder sb = new StringBuilder();
for(int i = 1; i<n+1; i++) {
if(answer[i] == max) sb.append(i + " ");
}
System.out.print(sb);
}
}
'알고리즘 문제풀이 > 백준-오답노트' 카테고리의 다른 글
오답노트 #16564 : 히오스 프로게이머 (0) | 2022.06.10 |
---|---|
오답노트 #2370 : 시장 선거 포스터 (0) | 2022.06.08 |
오답노트 #24479 : 알고리즘 수업 - 깊이 우선 탐색 1 (0) | 2022.05.27 |
오답노트 #1744 : 수 묶기 (0) | 2022.05.07 |
오답노트 #1202 : 보석 도둑 (0) | 2022.04.30 |