※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 24912번 문제인 카드 색칠이다.
문제는 아래 링크를 확인하자.

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

 

24912번: 카드 색칠

첫째 줄에 카드의 개수를 나타내는 정수 N이 주어진다. 둘째 줄에 N 개의 정수가 공백으로 구분되어 주어진다. i 번째 정수 ai는 i 번째 카드의 색깔을 나타낸다. 1, 2, 3은 각각 빨간색, 초록색, 파

www.acmicpc.net

각 카드에 사용할 수 있는 색은 1, 2, 3의 세가지이다.

 

예제3과 같이 처음서부터 색이 같은 두 카드가 인접하게 놓인 부분이 있다면 -1을 출력하자.

 

그렇지 않다면, 아직 색이 칠해지지 않은 카드를 좌우의 색과 다른 색으로 칠하는 것으로 항상 문제의 조건을 만족하는 색칠을 할 수 있다.

 

이러한 색칠이 항상 존재하는 이유는 사용할 수 없는 색은 최대 두가지(양옆 카드의 색)지만 사용할 수 있는 색은 세가지이기 때문이다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int arr[1000000];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	bool chk = 1;
	int N; cin >> N;
	for (int i = 0; i < N; i++) cin >> arr[i];
	for (int i = 1; i < N; i++) {
		if (arr[i] && (arr[i - 1] == arr[i])) chk = 0;
	}

	if (chk) {
		for (int i = 0; i < N; i++) {
			if (arr[i] == 0) {
				int colors[4] = { 0,0,0,0 };
				if (i > 0)  colors[arr[i - 1]] = 1;
				if (i < N - 1) colors[arr[i + 1]] = 1;
				if (colors[1] == 0) arr[i] = 1;
				else if (colors[2] == 0) arr[i] = 2;
				else arr[i] = 3;
			}
		}

		for (int i = 0; i < N; i++) cout << arr[i] << ' ';
	}
	else cout << -1;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 3110 // C++] 부등식  (0) 2022.04.15
[BOJ 3111 // C++] 검열  (0) 2022.04.14
[BOJ 24884 // C++] 장작 넣기  (0) 2022.04.12
[BOJ 24891 // C++] 단어 마방진  (0) 2022.04.11
[BOJ 24418 // C++] 알고리즘 수업 - 행렬 경로 문제 1  (0) 2022.04.10

+ Recent posts