728x90

문제

최대 K가지의 서로 다른 색을 표현할 수 있는 전구들이 있다. 이 전구 N개를 다음의 그림과 같이 한 줄로 배치하여 서로 연결한다. (동그라미 안의 숫자는 전구의 색을 의미한다)

각 전구는 스위치가 있어서 전구의 색을 임의의 색으로 바꿀 수 있다. 하나의 전구 색을 바꾸는 경우에는, 색이 바뀌는 전구에 인접한 전구가 같은 색이면, 이 전구의 색도 같이 바뀌게 되며 인접한 전구가 다른 색이 나올 때까지 계속 바뀌게 된다. 예를 들어, 위의 그림에서 4번 전구의 색을 2번 색으로 바꾸면, 5번 전구가 4번 전구와 같은 색이었으므로 2번 색으로 바뀌고, 6번 전구도 5번 전구와 같은 색이었으므로 2번 색으로 바뀌게 된다. 즉, 4번 전구의 색을 2번 색으로 바꾸면, 연결된 같은 색의 모든 전구인 4, 5, 6번의 전구가 2번 색으로 바뀌게 되어 아래의 그림과 같이 된다.

전구의 수 N과 N개의 전등에 대한 초기 색이 주어질 때, 모든 전구의 색이 하나로 같아질 때까지 최소 몇 번 전구의 색을 바꾸어야 하는지를 구하는 프로그램을 작성하시오. 단, 전구의 각 색은 1부터 K까지의 정수로 나타낸다.

입력

입력의 첫 번째 줄에는 전구의 수를 나타내는 양의 정수 N과 전구가 표현할 수 있는 색의 수 K가 주어진다. 단, N은 1이상 200이하의 정수이며, K는 1이상 20이하의 정수이다. 두 번째 줄에는 N개 전구의 색이 전구번호의 순서대로 하나의 정수로 하나의 빈칸을 사이에 두고 주어진다.

출력

첫째 줄에 모든 전구의 색이 하나로 같아질 때까지 전구의 색을 바꾸는 횟수의 최솟값을 하나의 정수로 출력한다.

예제 입력 1 복사

10 3 1 1 2 3 3 3 2 2 1 1

예제 출력 1 복사

2


dp 문제였지만 인덱싱 설정이 까다로운 문제였다.

dp[i][j]를 i부터 j번까지 전구를 i번 전구로 설정할 때 전구의 색을 바꾼 횟수로 설정한다.

그 후 dfs를 통해 dfs(1,N)을 실행한다.

dfs에선 start부터 end까지 각 지점에서 다시 세부 dfs 방문한다. start에서 i까지를 같은 전구로 설정한 후, i+1에서 end까지를 같은 전구를 설정해서 얻을 수 있는 최소값을 구한다. 이 때 start와 i+1의 전구가 같은지 다른지를 확인해서 +1을 해준다. 그렇게 모든 점을 검사하면 된다.

 

코드 원본 : https://github.com/chosh95/STUDY/blob/master/BaekJoon/2020/%EC%A0%84%EA%B5%AC%20(2449%EB%B2%88).cpp

 

chosh95/STUDY

프로그래밍 문제 및 알고리즘 정리. Contribute to chosh95/STUDY development by creating an account on GitHub.

github.com

C++ 코드

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int N, K;
int p[201];
int dp[201][201];

int dfs(int start, int end) {
	if (start == end) return 0;
	int& res = dp[start][end];
	if (res != -1) return res;
	res = 987654321;

	for (int i = start; i < end; i++) {
		int tmp = p[start] != p[i+1] ? 1 : 0;
		res = min(res, dfs(start, i) + dfs(i + 1, end) + tmp);
	}
	return res;
}

int main()
{
	cin >> N >> K;
	for (int i = 1; i <= N; i++) cin >> p[i];
	memset(dp, -1, sizeof(dp));
	cout << dfs(1, N);
}

 

728x90

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

[백준] 단어 수학 (1339번)  (0) 2020.06.23
[백준] 조 짜기 (2229번)  (0) 2020.06.22
[백준] 앱 (7579번)  (0) 2020.06.22
[백준] 효율적인 해킹(1325번)  (0) 2020.06.18
[백준] 중량제한 (1939번)  (0) 2020.06.16

+ Recent posts