기록하지 않았다면 잃어버릴 시간들
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)
블로그 내 검색

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

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

  • 알고리즘/백준

    BOJ1516/ C++

    2022. 1. 3.

    by. 내이름은 킹햄찌

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

     

    1516번: 게임 개발

    첫째 줄에 건물의 종류 수 N(1 ≤ N ≤ 500)이 주어진다. 다음 N개의 줄에는 각 건물을 짓는데 걸리는 시간과 그 건물을 짓기 위해 먼저 지어져야 하는 건물들의 번호가 주어진다. 건물의 번호는 1부

    www.acmicpc.net

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

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

     

    #include <iostream>
    #include <vector>
    #include <queue>
    using namespace std;
    
    int n;
    int time[501];
    int dp[501];
    int buildingCnt[501];
    vector<int> building[501];
    
    int max(int a, int b) { return a > b ? a : b; }
    
    void Input() {
    	cin >> n;
    	for (int i = 1; i <= n; i++) {
    		int x;
    		cin >> time[i];
    		dp[i] = time[i];
    		while (true) {
    			cin >> x;
    			if (x == -1) break;
    			else {
    				building[x].push_back(i);
    				buildingCnt[i]++;
    			}
    		}
    	}
    }
    
    void solution() {
    	queue<int> q;
    	for (int i = 1; i <= n; i++) {
    		if (buildingCnt[i] == 0)
    			q.push(i);
    	}
    	while (!q.empty()) {
    		int cur = q.front();
    		q.pop();
    		for (int i = 0; i < building[cur].size(); i++) {
    			int next = building[cur][i];
    			dp[next] = max(dp[next], dp[cur] + time[next]); //건물을 짓는데 걸리는 시간의 최댓값
    			buildingCnt[next]--;
    			if (buildingCnt[next] == 0)
    				q.push(next);
    		}
    	}
    	for (int i = 1; i <= n; i++)
    		cout << dp[i] << "\n";
    }
    int main(void) {
    	Input();
    	solution();
    }

     

    아이디어

    위상정렬에서 건물을 짓는데 걸리는 시간의 최댓값을 구하는 부분만 구현

     

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

    BOJ14567/ C++  (0) 2022.01.03
    BOJ_2252 / C++  (0) 2022.01.03
    BOJ_16234 / C++  (0) 2021.12.24
    BOJ_14502 / C++  (0) 2021.10.03
    BOJ_1182 / C++  (0) 2021.10.03

    댓글

    관련글

    • BOJ14567/ C++ 2022.01.03
    • BOJ_2252 / C++ 2022.01.03
    • BOJ_16234 / C++ 2021.12.24
    • BOJ_14502 / C++ 2021.10.03
    맨 위로
전체 글 보기
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Powered by ⓒ Kakao Corp.

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

티스토리툴바