백준 q14567 - 선수과목 (Prerequisite)

2023. 10. 27. 14:45· 알고리즘/백준
 

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
'알고리즘/백준' 카테고리의 다른 글
  • [JAVA] 백준 q22862 - 가장 긴 짝수 연속한 부분 수열 (large)
  • [JAVA] 백준 q20922 - 겹치는 건 싫어
  • [JAVA] 백준 q2631 - 줄세우기
  • [JAVA] 백준 q9084 - 동전
하얀 돌덩이
하얀 돌덩이
하얀 돌덩이
돌덩이
하얀 돌덩이
전체
오늘
어제
  • 분류 전체보기 (59)
    • 개발 일지 (2)
    • 스프링 (1)
    • JAVA (2)
    • 딥러닝 (10)
    • 알고리즘 (43)
      • 개념 (4)
      • 프로그래머스 (5)
      • 백준 (34)
    • 후기 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
하얀 돌덩이
백준 q14567 - 선수과목 (Prerequisite)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.