기록하지 않았다면 잃어버릴 시간들
Home
  • 분류 전체보기 (184)
    • Lang (6)
      • c++ (2)
      • Java (2)
      • python (2)
    • 프레임워크 (18)
      • Spring (16)
      • JPA (2)
    • 알고리즘 (141)
      • 이론 (4)
      • 백준 (59)
      • Codility (13)
      • 프로그래머스 (65)
    • CS (4)
      • 운영체제 (0)
      • 자료구조 (0)
      • DB (4)
      • 네트워크 (0)
      • 보안 (0)
    • 기타 (7)
    • 프로젝트 (4)
      • 게시판 만들기로 배우는 Spring Data JP.. (4)
Home
  • 분류 전체보기 (184)
    • Lang (6)
      • c++ (2)
      • Java (2)
      • python (2)
    • 프레임워크 (18)
      • Spring (16)
      • JPA (2)
    • 알고리즘 (141)
      • 이론 (4)
      • 백준 (59)
      • Codility (13)
      • 프로그래머스 (65)
    • CS (4)
      • 운영체제 (0)
      • 자료구조 (0)
      • DB (4)
      • 네트워크 (0)
      • 보안 (0)
    • 기타 (7)
    • 프로젝트 (4)
      • 게시판 만들기로 배우는 Spring Data JP.. (4)
블로그 내 검색

기록하지 않았다면 잃어버릴 시간들

새로운 것을 배우는게 즐거운 개발자입니다.

  • 알고리즘/백준

    BOJ14567/ C++

    2022. 1. 3.

    by. 내이름은 킹햄찌

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

     

    14567번: 선수과목 (Prerequisite)

    3개의 과목이 있고, 2번 과목을 이수하기 위해서는 1번 과목을 이수해야 하고, 3번 과목을 이수하기 위해서는 2번 과목을 이수해야 한다.

    www.acmicpc.net

    백준 온라인저지 14567번 문제입니다. 

    위상정렬을 이용해서 풀었습니다.

    #include<iostream>
    #include<queue>
    #include<vector>
    #define MAX 1001
    using namespace std;
    
    int N, M;
    int PrerequisiteCnt[MAX];
    int Prerequisite[MAX];
    vector<int> v[MAX];
    
    int max(int a, int b) { return a > b ? a : b; }
    
    void Input() {
    	int a, b;
    	cin >> N >> M;
    	for (int i = 0; i < M; i++) {
    		cin >> a >> b;
    		v[a].push_back(b);
    		Prerequisite[b]++;
    	}
    }
    
    void solution() {
    	queue<int> q;
    	for (int i = 1; i <= N; i++) {
    		if (Prerequisite[i] == 0) {
    			q.push(i);
    			PrerequisiteCnt[i]++;
    		}
    	}
    		
    
    	while (!q.empty()) {
    		int current = q.front(); 
    		q.pop();
    
    		for (int next = 0; next < v[current].size(); next++) {
    			if (--Prerequisite[v[current][next]] == 0) 
    				q.push(v[current][next]);
    			PrerequisiteCnt[v[current][next]] = max(PrerequisiteCnt[v[current][next]], PrerequisiteCnt[current] + 1);
    		}
    	}
    
    	for (int i = 1; i <= N; i++) {
    		cout << PrerequisiteCnt[i] << " ";
    	}
    }
    
    int main(void) {
    	Input();
    	solution();
    }

    아이디어

    과목을 듣는데 필요한 과목 나열이 아닌 선수 조건이 있을 수 있는 과목들을 듣는데 걸리는 최소시간을 출력하는 문제임

    위상정렬을 하며 현재 과목을 이수하는데 걸리는 시간과 선수과목 + 1을 하여 시간이 오래걸리는게 해당 과목을 이수하기 위한 최소 시간임

     

    '알고리즘 > 백준' 카테고리의 다른 글

    BOJ2637/ C++  (0) 2022.01.03
    BOJ1516/ C++  (0) 2022.01.03
    BOJ_2252 / C++  (0) 2022.01.03
    BOJ1516/ C++  (0) 2022.01.03
    BOJ_16234 / C++  (0) 2021.12.24

    댓글

    관련글

    • BOJ2637/ C++ 2022.01.03
    • BOJ1516/ C++ 2022.01.03
    • BOJ_2252 / C++ 2022.01.03
    • BOJ1516/ C++ 2022.01.03
    맨 위로
전체 글 보기
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Powered by ⓒ Kakao Corp.

Designed by Nana
블로그 이미지
내이름은 킹햄찌

티스토리툴바