알고리즘

C++ 알고리즘 - 1149 RGB 거리

마루설아 2025. 1. 24. 14:12

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

 

#include <bits/stdc++.h>
#define endl "\n"

using namespace std;

/******** 전역변수 ********/


/******** 함    수 ********/


int main(void) {
	/******** C++ INIT ********/
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	/******** 지역변수 ********/
	int input1;
	int input2;
	vector<int> result;

	/******** 구    현 ********/
	cin >> input1;

	// 점화식 : 첫 RGB 금액대 벡터에 삽입
	cin >> input2; result.push_back(input2);
	cin >> input2; result.push_back(input2);
	cin >> input2; result.push_back(input2);

	// 두번째 RGB부터 동적 프로그래밍 시작
	for (int i = 3; i < input1 * 3; i++) {
		cin >> input2;

		// R의 가격 최소값 구하기 : R + 이전 G 또는 B 중 최소값
		if (i % 3 == 0)
			result.push_back(min(input2 + result[i - 2], input2 + result[i - 1]));

		// G의 가격 최소값 구하기 : G + 이전 R 또는 B 중 최소값
		else if (i % 3 == 1)
			result.push_back(min(input2 + result[i - 4], input2 + result[i - 2]));

		// B의 가격 최소값 구하기 : B + 이전 R 또는 G 중 최소값
		else
			result.push_back(min(input2 + result[i - 5], input2 + result[i - 4]));
	}

	// 벡터의 마지막 3개의 요소 중 최소값은 전체 집 칠하기 최소 비용이 됨
	cout << *min_element(result.end() - 3, result.end());
}