[BOJ/1516] 게임 개발, c++

2021. 2. 8. 15:23·DEV/PS

www.acmicpc.net/problem/1516

 

1516번: 게임 개발

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

www.acmicpc.net

한줄 후기 : solved ac class 5를 따기 위한 눈물 겨운 여정..


 

문제를 읽으면서 건물 짓는 순서가 주어지길래 위상정렬인 것 같다고 생각하고 풀었다.

 

//AC
//BOJ 1516 게임 개발
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int ind[501];
int ans[501];
int c[501];
vector<int> v[501];
void topo(int N){
	queue<int> q;
	for(int i=1; i<=N; i++){
		if(ind[i] == 0){
			q.push(i);
		}
	}
	while(!q.empty()){
		int x = q.front();
		c[x] = ans[x];
		q.pop();
		for(int y : v[x]){
			ind[y] -= 1;
			ans[y] = max(ans[y], c[y]+ans[x]);
			if(ind[y] == 0){
				q.push(y);
			}
			
		}
	}
}
int main(){
	int N, t;
	cin >> N;
	for(int i=1; i<=N; i++){
		scanf("%d", &c[i]);
		ans[i] = c[i];
		while(1){
			scanf("%d", &t);
			if(t==-1)	break;
			v[t].push_back(i);
			ind[i]++;
		}
	}
	topo(N);
	for(int i=1; i<=N; i++){
		printf("%d\n", ans[i]);
	}	
	return 0;
}

그냥 풀면 틀린다. 아래는 처음 틀린 코드 

//WA
//BOJ 1516 게임 개발
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int ind[501];
int ans[501];
int c[501];
vector<int> v[501];
void topo(int N){
	queue<int> q;
	for(int i=1; i<=N; i++){
		if(ind[i] == 0){
			q.push(i);
		}
	}
	while(!q.empty()){
		int x = q.front();
		q.pop();
		for(int y : v[x]){
			ind[y] -= 1;
			if(ind[y] == 0){
				q.push(y);
				ans[y] += ans[x];
			}
		}
	}
}
int main(){
	int N, t;
	cin >> N;
	for(int i=1; i<=N; i++){
		scanf("%d", &c[i]);
		ans[i] += c[i];
		while(1){
			scanf("%d", &t);
			if(t==-1)	break;
			v[t].push_back(i);
			ind[i]++;
		}
	}
	topo(N);
	for(int i=1; i<=N; i++){
		printf("%d\n", ans[i]);
	}	
	return 0;
}

여러곳에서 건물을 모두 지어야만 지을 수 있는 건물들을 고려하지 않았었다.

그런 건물들은 전에 지은 건물들 중 최대 비용을 찾아줘야한다.

ans[y] = max(ans[y], c[y]+ans[x]);

그래서 이 부분이 키포인트이다.

매 건물마다 현재 건물 건설 비용+바로 직전 건물 건설 비용, 현재 비용(직전에 여러개를 지을 수 있으므로)

중 최댓값을 저장해주어야 한다.

아 비용이라 해서 왜 최댓값이지 라는 의문이 들 수 있는데 비용이 아니라 시간이니까 당연히 건물이 모두 지어질 때 까지 기다려야해서 최댓값으로 구해줘야한다.  

 

저작자표시 비영리 변경금지 (새창열림)

'DEV > PS' 카테고리의 다른 글

[BOJ/8201] Pilots, c++  (0) 2021.02.15
PS용 비트 연산자(bit masking) 정리  (0) 2021.02.14
[1520] 내리막 길, c++  (0) 2021.02.07
[14501] 퇴사, c++  (0) 2021.02.07
[11048] 이동하기, c++  (0) 2021.02.07
'DEV/PS' 카테고리의 다른 글
  • [BOJ/8201] Pilots, c++
  • PS용 비트 연산자(bit masking) 정리
  • [1520] 내리막 길, c++
  • [14501] 퇴사, c++
jobchae
jobchae
말하는 감자지만, 코드를 끄적이는 Node.js 백엔드 개발자입니다.
  • jobchae
    JOBCHAE
    jobchae
  • 전체
    오늘
    어제
    • 🚀 JOBCHAE (182)
      • DEV (151)
        • PS (108)
        • Node.js (12)
        • React (3)
        • docker (1)
        • 잡다한 개발 일지 (21)
        • injection (1)
        • JS, TS (3)
        • DB (2)
      • 축구 (0)
      • 일상 (19)
      • 영화 (3)
      • 음악 (8)
  • 블로그 메뉴

    • 💻 Github
    • 🙋🏻 Linkedin
    • 📖 방명록
  • 링크

    • PS Github
  • 공지사항

  • 인기 글

  • 태그

    리액트
    솝트
    db
    Nest.js
    우선순위큐
    PS
    Express
    typescript
    알고리즘
    위상정렬
    슬랙봇
    node.js
    react
    mongoDB
    앱잼
    boj
    렛츠락페스티벌
    일상
    회고
    DFS
    GitHub
    슬랙
    개발
    JavaScript
    nodejs
    BFS
    백준
    SOPT
    이분탐색
    DP
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
jobchae
[BOJ/1516] 게임 개발, c++
상단으로

티스토리툴바