문제
https://www.acmicpc.net/problem/1149
1149번: RGB거리
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나
www.acmicpc.net
코드
#include <bits/stdc++.h>
using namespace std;
int n, cost[3], house[1004][3];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> cost[0] >> cost[1] >> cost[2];
house[i][0] = min(house[i-1][1],house[i-1][2]) + cost[0];
house[i][1] = min(house[i-1][0],house[i-1][2]) + cost[1];
house[i][2] = min(house[i-1][1],house[i-1][0]) + cost[2];
}
cout << min(house[n][2], min(house[n][0], house[n][1]));
return 0;
}
house[i][color] 는 i번째 집을 빨강 / 초록 / 파랑으로 칠했을 때의 최소비용을 의미한다.
즉, house[i][0] 는 i번째 집을 빨강으로칠했을 때의 최소비용을 의미한다.
house[i][1] 는 i번째 집을 초록으로칠했을 때의 최소비용을 의미한다.
house[i][2] 는 i번째 집을 파랑으로칠했을 때의 최소비용을 의미한다.
위 코드를 찍어보면 아래와 같이 나오는 것을 알 수 있다.
house[1][0] 은 1번째 집을 빨강으로 칠했을 때의 최소비용으로, 이전 집이 없기 때문에 이전집의 값은 모두 0으로 초기화 되어있는 상태이다. 1번째 집을 빨강으로 칠했을 때의 비용을 더해서 house[1][0] 값을 갱신한다.
house[1][1] 은 1번째 집을 초록으로 칠했을 때의 최소비용으로, 이전 집이 없기 때문에 이전집의 값은 모두 0으로 초기화 되어있는 상태이다. 1번째 집을 초록으로 칠했을 때의 비용을 더해서 house[1][1] 값을 갱신한다.
house[1][2] 은 1번째 집을 파랑으로 칠했을 때의 최소비용으로, 이전 집이 없기 때문에 이전집의 값은 모두 0으로 초기화 되어있는 상태이다. 1번째 집을 파랑으로 칠했을 때의 비용을 더해서 house[1][2] 값을 갱신한다.
house[2][0] 은 2번째 집을 빨강으로 칠했을 때의 최소비용으로, 1번째 집을 초록또는 파랑으로 칠했을 때의 최소비용을 구한다음, 2번째 집을 빨강으로 칠했을 때의 비용을 더해서 house[2][0] 값을 갱신한다.
house[2][1] 은 2번째 집을 초록으로 칠했을 때의 최소비용으로, 1번째 집을 빨강또는 파랑으로 칠했을 때의 최소비용을 구한다음, 2번째 집을 초록으로 칠했을 때의 비용을 더해서 house[2][1] 값을 갱신한다.
house[2][2] 은 2번째 집을 파랑으로 칠했을 때의 최소비용으로, 1번째 집을 초록또는 빨강으로 칠했을 때의 최소비용을 구한다음, 2번째 집을 초록으로 칠했을 때의 비용을 더해서 house[2][2] 값을 갱신한다.
house[3][0] 은 3번째 집을 빨강으로 칠했을 때의 최소비용으로, 2번째 집을 초록또는 파랑으로 칠했을 때의 최소비용을 구한다음, 3번째 집을 빨강으로 칠했을 때의 비용을 더해서 house[3][0] 값을 갱신한다.
house[3][1] 은 3번째 집을 초록으로 칠했을 때의 최소비용으로, 2번째 집을 빨강또는 파랑으로 칠했을 때의 최소비용을 구한다음, 3번째 집을 초록으로 칠했을 때의 비용을 더해서 house[3][1] 값을 갱신한다.
house[3][2] 은 3번째 집을 파랑으로 칠했을 때의 최소비용으로, 2번째 집을 초록또는 빨강으로 칠했을 때의 최소비용을 구한다음, 3번째 집을 초록으로 칠했을 때의 비용을 더해서 house[3][2] 값을 갱신한다.
그런다음 house[3][0], house[3][1], house[3][2] 중에서 가장 작은 값을 구하면 문제에서 요구하는 값을 출력할 수 있다.
여기서 마직막집에 대한 배열값만 비교를해도 되는 이유는,
house[3][0] 는 3번째 집을 빨강색으로 칠했을 경우 비용을 의미하고
house[3][1] 는 3번째 집을 초록색으로 칠했을 경우 비용을 의미하고
house[3][2] 는 3번째 집을 파랑색으로 칠했을 경우 비용을 의미하는데,
더 자세히 풀어서 설명하면,
house[3][0] 는 3번째 집을 빨강색으로 칠했을 경우에는, 2번째 집을 초록색 또는 파랑색으로 칠했을 경우의 최소값이 담겨있고, 1번째 2번째 집과 겹치지 않는 색으로 칠했을 경우의 최소값이 담겨있기 때문에 house[3][0] 를 출력하면 1번째, 2번째, 3번째 집을 모두 칠한 비용이 담겨져있음을 의미한다.
house[3][1] 는 3번째 집을 초록색으로 칠했을 경우에는, 2번째 집을 빨강색 또는 파랑색 으로 칠했을 경우의 최소값이 담겨있고, 1번째 2번째 집과 겹치지 않는 색으로 칠했을 경우의 최소값이 담겨있기 때문에 house[3][1] 를 출력하면 1번째, 2번째, 3번째 집을 모두 칠한 비용이 담겨져있음을 의미한다.
house[3][2] 는 3번째 집을 파랑색으로 칠했을 경우에는, 2번째 집을 빨강색 또는 초록색으로 칠했을 경우의 최소값이 담겨있고, 1번째 2번째 집과 겹치지 않는 색으로 칠했을 경우의 최소값이 담겨있기 때문에 house[3][1] 를 출력하면 1번째, 2번째, 3번째 집을 모두 칠한 비용이 담겨져있음을 의미한다.
'개발 > 알고리즘' 카테고리의 다른 글
백준 2022 사다리 C++ / Java (0) | 2021.06.17 |
---|---|
백준 1939 중량제한 C++ /Java (0) | 2021.06.17 |
백준 16118 달빛여우 C++ (0) | 2021.05.31 |
백준 9370 미확인 도착지 C++ (0) | 2021.05.29 |
펜윅 트리란?(Fenwick Tree, Binary Indexed Tree) (0) | 2021.05.28 |