※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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 |