본문 바로가기
알고리즘 문제/백준

[백준 알고리즘] 1149번 : RGP거리

by 에르주 2020. 8. 5.
반응형

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

 

1149번: RGB거리

첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나

www.acmicpc.net

문제

RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.

집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.

  • 1번 집의 색은 2번 집의 색과 같지 않아야 한다.
  • N번 집의 색은 N-1번 집의 색과 같지 않아야 한다.
  • i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다.

 

입력

첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.

 

풀이

해당 문제는 다이나믹 프로그래밍 문제로써 작은 표본을 바탕으로 전체 N개로 확장하는 것이다.

여기서 중요한점은 N번 집의 색과 N-1번 집의 색과 같지 않아야 한다는 것인데 마지막 집인 경우의 수는 총 3가지 (빨간색, 초록색, 파랑색)  이다

 

1) 빨간색

  • 초록색
  • 파랑색

2) 초록색

  • 빨강색
  • 파랑색

3) 파랑색

  • 빨강색
  • 초록색

총 6가지의 경우의 수가 나오게 된다.

 

#include<iostream>

using namespace std;

int HouseArray[1000][3];
int min(int a, int b) {

	return a < b ? a : b;
}

int main() {

	int numHouse;
	cin >> numHouse;

	for (int i = 0; i < numHouse; i++) {
		for (int j = 0; j < 3; j++) {

			int temp;
			cin >> temp;
			HouseArray[i][j] = temp;
		}
	}

	for (int k = 0; k < numHouse; k++) {

		HouseArray[k+1][0] = min(HouseArray[k][1], HouseArray[k][2]) + HouseArray[k+1][0];
		HouseArray[k+1][1] = min(HouseArray[k][0], HouseArray[k][2]) + HouseArray[k+1][1];
		HouseArray[k+1][2] = min(HouseArray[k][0], HouseArray[k][1]) + HouseArray[k+1][2];

	}

	int answer = min(min(HouseArray[numHouse][0], HouseArray[numHouse][1]), HouseArray[numHouse][2]);

	cout << answer << endl;


}

 

이 코드에서 0, 1, 2 번째 행은 빨강, 초록, 파랑이다.

즉 HouseArray[k][0]은 k번째의 빨강색을 칠했을 때의 비용으로 생각하면 된다.

 

그렇기 때문에 for문에 따라 1, 2, 3, 4, .... , i-1, i, i+1, ..., N-1, N 증가 함에 따라 

그 전까지의 비용 최솟값 + 해당하는 k번째의 비용을 더하는 것이 k번째까지 집을 색칠 했을 때의 최소 비용을 의미한다.

 

앞에서 마지막 색에 따라 6가지의 경우의 수가 나오기 때문에

 

for (int k = 0; k < numHouse; k++) {

		HouseArray[k+1][0] = min(HouseArray[k][1], HouseArray[k][2]) + HouseArray[k+1][0];
		HouseArray[k+1][1] = min(HouseArray[k][0], HouseArray[k][2]) + HouseArray[k+1][1];
		HouseArray[k+1][2] = min(HouseArray[k][0], HouseArray[k][1]) + HouseArray[k+1][2];

	}

 

이런식으로 구현하게 된다.

 

 

끝.

반응형

댓글