본문 바로가기
백준 코딩테스트/실버

1149) RGB거리 (C++)

by xortl98 2022. 4. 22.
728x90

출처 

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

 

1149번: RGB거리

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

www.acmicpc.net

 내 풀이 

#include<iostream>

using namespace std;

int house[1001][3];	//범위 지정 N=2~1000  RGB=3 
int N = 0;

int main()
{
	cin >> N;

	//RGB값을 입력받음 
	for (int i = 1; i <= N; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cin >> house[i][j];
		}
	}

	//2부터 시작하여 전 값 비교
	for (int i = 2; i <= N; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			//만일 0(R일 경우) 전에 있던 G값과 B값을 비교하여 작은 값을 넣어준다. 
			if (j == 0)
			{
				house[i][j] = min(house[i][j] + house[i - 1][j + 1], house[i][j] + house[i - 1][j + 2]);
			}
			//만일 1(G일 경우) 전에 있던 R값과 B값을 비교하여 작은 값을 넣어준다.
			else if (j == 1)
			{
				house[i][j] = min(house[i][j] + house[i - 1][j - 1], house[i][j] + house[i - 1][j + 1]);
			}
			//만일 2(B일 경우) 전에 있던 R값과 G값을 비교하여 작은 값을 넣어준다. 
			else
			{
				house[i][j] = min(house[i][j] + house[i - 1][j - 2], house[i][j] + house[i - 1][j - 1]);
			}
		}
	}

	/* 잘 비교되었는지 확인 
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << house[i][j] << " ";
		}
		cout << endl;
	}
	*/

    //결과 초기값은 임의로 맨 마지막 N 0 배열에 있는 수 배치 
	int result = house[N][0];

	for (int i = 0; i < 3; i++)
	{
		result = min(result, house[N][i]);
	}
	cout << result;
}

 

 해설

맨 처음 지문이 이해가 안가서 동빈나님 다이나믹 프로그래밍 강의를 한번 더 들은 후 풀어보았다.

 

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

RGB 값을 입력 받고 2번째 RGB값부터 위의 조건에 따라서 

R -> 현재 R + 이전 G, 현재 R+ 이전 B

G -> 현재 G +이전 R, 현재 G + 이전 B

B -> 현재 B + 이전 R, 현재 B + 이전 G

2개값을 비교하여 최소값을 넣어가면서 마지막까지 반복해주었다. 

 

마지막 RGB값을 비교해서 작은 값을 출력하게 해주었다. 

 

 새로 안 것 

다이나믹 프로그래밍 하는 방법 

 

 

'백준 코딩테스트 > 실버' 카테고리의 다른 글

1932) 정수 삼각형 (C++)  (0) 2022.04.23
1012) 유기농 배추 (C++)  (0) 2022.04.23
11047) 동전 0 (C++)  (0) 2022.04.20
9461) 파도반 수열 (C++)  (0) 2022.04.20
1904) 01타일 (C++)  (0) 2022.04.19