공부 기록

C++ 백준 1149번

by 너나나

백준 1149번 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번 집의 색과 같지 않아야 한다.

모든 집을 R,G,B 로 칠하는 최솟값을 구하는 문제이다. 각 집마다 비용이 다르다!!

a[i][j] = i번 집을 색 j로 칠하는 비용이라고 하고 (j는 0, 1, 2)

d[i][j] = i번 집을 색 j로 칠했을 때, 1~i번 집을 칠하는 비용의 최솟값이라고 하자.

그러면

d[i][0] = min(d[i-1][1] + d[i-1][2]) + a[i][0]

d[i][1] = min(d[i-1][0] + d[i-1][2]) + a[i][1]

d[i][2] = min(d[i-1][0] + d[i-1][1]) + a[i][2]

로 나타낼 수 있고 여기서 가장 작은 d[i][j] 값을 찾으면 된다.

 

#include<iostream>
#include<algorithm>
using namespace std;
int a[1001][3]; // i번 집을 색 j로 칠하는 비용
int d[1001][3]; // i번 집을 색 j로 칠했을 때, 1~i번 집을 칠하는 비용의 최솟값 
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	int t;
	cin >> t;
	for (int i = 1; i <= t; i++) {
		for (int j = 0; j < 3; j++) {
			cin >> a[i][j];
		}
	}
	for (int i = 1; i <= t; i++) {
		d[i][0] = min(d[i - 1][1], d[i - 1][2]) + a[i][0]; 
		d[i][1] = min(d[i - 1][0], d[i - 1][2]) + a[i][1];
		d[i][2] = min(d[i - 1][0], d[i - 1][1]) + a[i][2];
	}
	cout << min({ d[t][0], d[t][1], d[t][2] }) << '\n';
}

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

C++ 백준 9465번  (0) 2021.01.05
C++ 백준 1309번  (0) 2021.01.04
C++ 백준 15988번  (0) 2021.01.04
C++ 백준 1699번  (0) 2021.01.02
C++ 백준 1912번  (0) 2021.01.02

블로그의 정보

공부 기록

너나나

활동하기