Algorithm/Beakjoon

[JAVA] 백준 14567번 : 선수과목 (Prerequisite)

mopipi 2024. 5. 12. 23:04
반응형

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


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main_14567 {
    static int N, M;
    static int[] dp;
    static ArrayList<Integer>[] prerequisite;
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        dp = new int[N + 1];
        prerequisite = new ArrayList[N + 1];
        for (int i = 1; i <= N; i++) {
            prerequisite[i] = new ArrayList<>();
        }
        while (M-- > 0) {
            st = new StringTokenizer(br.readLine());
            int A = Integer.parseInt(st.nextToken());
            int B = Integer.parseInt(st.nextToken());
            prerequisite[A].add(B);
        }
        Arrays.fill(dp, 1);
        for (int i = 1; i <= N; i++) {
            if(prerequisite[i].isEmpty())
                continue;
            for (int num : prerequisite[i]) {
                dp[num] = Math.max(dp[num], dp[i] + 1);
            }
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= N; i++) {
            sb.append(dp[i]).append(" ");
        }
        System.out.println(sb);
    }
}

💡 DP

풀이

  • 처음에는 BFS로 진행했지만 시간 초과뜸..ㅎㅎ
    • 선수과목이 여러 개인 경우도 존재함!
  • DP를 활용하자
    • dp를 진행하기 위해선 앞 과목부터 진행해야 함 (선수과목 번호 < 과목 번호 이므로) -> ArrayList에 1부터 정의
    • DP[과목 번호] = 해당 과목을 수강하기까지 필요한 과목수
    • -> DP[B] = DP[A] + 1
    • 이때, 앞서 말했듯 선수과목이 여러 개인 경우도 존재하므로 무조건 새 값으로 갱신해주면 안됨. 선수과목 중 제일 늦게끝나는 과목 날짜 + 1 해야 함
    • -> DP[B] = Math.max(dp[B], dp[A] + 1) 로 가야 한다
반응형