728x90
안녕하세요! 오늘은 백준 1018번 "체스판 다시 칠하기" 문제를 풀어보겠습니다.
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
문제 설명
- 체스판은 8x8크기이다. 가장 왼쪽 위 칸이 흰색이다.
- 체스판을 색칠한 정보가 주어졌을 때, 다시 칠해야 하는 정사각형 개수의 최솟값을 구하는 프로그램을 작성하시오.
입력
- 첫째 줄에 N과 M이 주어진다. (8 ≤ N, M ≤ 50)
- 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색, W는 흰색이다.
출력
- 첫째 줄에 다시 칠해야 하는 정사각형 개수의 최솟값을 출력한다.
풀이 방법
- 8x8 크기의 임시 체스판을 만든다.
- 입력으로 주어진 체스판 데이터와 임시 체스판을 비교하며 다시 칠해야 할 부분 카운트
- 가능한 8가지 경우를 모두 비교하여 카운트가 가장 작은 경우를 찾는다.
입력으로는 보드의 크기 N과 M이 주어지고, N개의 줄에는 보드의 각 행의 상태가 주어집니다. 검은색은 'B'로, 흰색은 'W'로 표시됩니다. 이 문제를 해결하기 위해서는 보드의 각 위치를 탐색하면서 체스판과 비교해야 합니다. 체스판은 검은색과 흰색이 번갈아가며 칠해져야 하므로, 현재 위치와 체스판의 색이 다른 경우에는 다시 칠해야 하는 정사각형의 개수를 증가시킵니다.
아래는 이 문제를 해결할 수 있는 C언어 코드입니다:
#include <stdio.h>
int main() {
int N, M;
scanf("%d %d", &N, &M);
char board[50][50];
for (int i = 0; i < N; i++) {
scanf("%s", board[i]);
}
int minCount = 64; // 최소 개수를 64로 초기화
for (int i = 0; i <= N - 8; i++) {
for (int j = 0; j <= M - 8; j++) {
int count1 = 0; // 맨 왼쪽 위가 'W'인 경우
int count2 = 0; // 맨 왼쪽 위가 'B'인 경우
for (int x = i; x < i + 8; x++) {
for (int y = j; y < j + 8; y++) {
// 체스판과 비교하여 다른 경우에는 카운트를 증가시킴
if ((x + y) % 2 == 0) {
if (board[x][y] != 'W') count1++;
if (board[x][y] != 'B') count2++;
} else {
if (board[x][y] != 'B') count1++;
if (board[x][y] != 'W') count2++;
}
}
}
// 최소 개수 갱신
if (count1 < minCount) minCount = count1;
if (count2 < minCount) minCount = count2;
}
}
printf("%d\n", minCount);
return 0;
}
이 코드는 먼저 입력으로 받은 보드의 크기와 상태를 저장한 후, 모든 가능한 8x8 체스판을 탐색하면서 다시 칠해야 하는 정사각형의 최소 개수를 구합니다. 각 위치에서 체스판과 비교하여 다른 경우에는 카운트를 증가시키고, 최소 개수를 갱신합니다. 마지막으로 최소 개수를 출력합니다.
오늘도 화이팅!!
728x90
'백준 문제 풀이 > c언어' 카테고리의 다른 글
백준 1436번 "solved.ac" --- c (0) | 2024.03.25 |
---|---|
백준 1436번 "영화감독 숌" --- c (1) | 2024.02.29 |
백준 25083 C언어 문제 풀이 - 새싹 (0) | 2024.01.28 |
백준 10989 C언어 문제 풀이 - 수 정렬하기 3 (0) | 2024.01.28 |
백준 10172 C언어 문제 풀이 - 개 (1) | 2024.01.28 |