14567번: 선수과목 (Prerequisite)
3개의 과목이 있고, 2번 과목을 이수하기 위해서는 1번 과목을 이수해야 하고, 3번 과목을 이수하기 위해서는 2번 과목을 이수해야 한다.
www.acmicpc.net
의식의 흐름
선수 과목에 대한 Arraylist 배열(subjects)을 만들고 개수를 세면 되지 않나,,
이후에 'A < B인 입력만 주어진다'는 조건을 제대로 안보고 시작 과목을 어떻게 정하지?하고 엄청 헤맸다👻
풀이 과정
1. 과목의 수(N), 선수 조건의 수(M)를 입력 받는다.
2. 어떤 과목의 선수 과목인지 담을 배열(subjects)과 선수과목 수를 담을 배열(dp)를 생성한다.
- subjects : ArrayList[]
- dp : int[]
3. subjects를 채우고 dp는 1로 초기화한다.
4. 선수과목이 i번 과목인 과목들에 대해 dp를 구한다.
for(int i=1;i<=N;i++){
ArrayList nextSubjects = subjects[i];
int nextSubjectCnt = nextSubjects.size();
for(int j=0;j
int nextSubject = nextSubjects.get(j);
dp[nextSubject] = Math.max(dp[nextSubject], dp[i]+1);
}
}
5. dp를 출력한다.
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
public static int N,M;
public static ArrayList<Integer>[] subjects;
public static int[] dp;
public static void main(String[] args) throws Exception{
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()); // 선수 조건의 수
subjects = new ArrayList[N+1]; // subjects[i] = 과목i가 어떤 과목들의 선수과목인가
dp = new int[N+1]; // 선수과목 수
for(int i=1;i<=N;i++){
subjects[i] = new ArrayList<Integer>();
dp[i] = 1;
}
for(int i=0;i<M;i++){
st = new StringTokenizer(br.readLine());
int prerequisite = Integer.parseInt(st.nextToken());
int subject = Integer.parseInt(st.nextToken());
subjects[prerequisite].add(subject);
}
for(int i=1;i<=N;i++){
ArrayList<Integer> nextSubjects = subjects[i];
int nextSubjectCnt = nextSubjects.size();
for(int j=0;j<nextSubjectCnt;j++){
int nextSubject = nextSubjects.get(j);
dp[nextSubject] = Math.max(dp[nextSubject], dp[i]+1);
}
}
for(int i=1;i<=N;i++){
bw.write(Integer.toString(dp[i])+" ");
}
bw.flush();
br.close();
bw.close();
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[JAVA] 백준 q22862 - 가장 긴 짝수 연속한 부분 수열 (large) (0) | 2023.11.20 |
---|---|
[JAVA] 백준 q20922 - 겹치는 건 싫어 (2) | 2023.10.30 |
[JAVA] 백준 q2631 - 줄세우기 (2) | 2023.10.26 |
[JAVA] 백준 q9084 - 동전 (0) | 2023.10.25 |
[JAVA] 백준 q9251 - LCS (0) | 2023.10.24 |