코스모스 공작소

백준 1145번 RGB거리 [성공] 본문

프로그래밍/알고리즘

백준 1145번 RGB거리 [성공]

cosmos_studio_ 2019. 12. 1. 16:45
반응형

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

 

1149번: RGB거리

RGB거리에 사는 사람들은 집을 빨강, 초록, 파랑중에 하나로 칠하려고 한다. 또한, 그들은 모든 이웃은 같은 색으로 칠할 수 없다는 규칙도 정했다. 집 i의 이웃은 집 i-1과 집 i+1이고, 첫 집과 마지막 집은 이웃이 아니다. 각 집을 빨강으로 칠할 때 드는 비용, 초록으로 칠할 때 드는 비용, 파랑으로 드는 비용이 주어질 때, 모든 집을 칠하는 비용의 최솟값을 구하는 프로그램을 작성하시오.

www.acmicpc.net

2차원 배열로 푸는 다이나믹 프로그래밍 문제이다.

각 지점에 대해 앞배열의 정보를 이용해 푼다. -> 이미 계산된 결과를 이용

#include <iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main(){
	int num;
	cin>>num;
	vector<vector<int>> dp;
	vector<int> temp;
	for(int i=0;i<3;i++){
		temp.push_back(0);
	}
	dp.push_back(temp);
	temp.clear();
	int num_input;
	for(int i=1;i<=num;i++){
		for(int j=0;j<3;j++){
			cin>>num_input;
			if(j==0){
				temp.push_back(min(dp[i-1][1],dp[i-1][2]) + num_input);
			}else if(j==1){
				temp.push_back(min(dp[i-1][0],dp[i-1][2]) + num_input);
			}else if(j==2){
				temp.push_back(min(dp[i-1][0],dp[i-1][1]) + num_input);
			}
		}
		dp.push_back(temp);
		temp.clear();
	}
	
	
	cout<<min(min(dp[num][0],dp[num][1]),dp[num][2]);
	return 0;
}

 

중간에 불필요한 for문이 있지만 중간에 저장할 배열을 선언하지 않기 위해서 이 방식을 선택했다.

더 좋은 방법이 있겠지만 vector를 연습중이라 사용하였다.

 

반응형
Comments