입력 코드
#include <stdio.h>
#define minF(a,b) a<b? a:b
main() {
int N, M;
scanf("%d %d", &N, &M);
char C[50][50];
int min = 80;
int cntB = 0, cntW = 0;
for (int i = 0; i < N; i++) {
scanf("%s", &C[i]);
}
for (int i = 0; i + 7 < N; i++) {
for (int j = 0; j + 7 < M; j++) {
cntB = 0;
cntW = 0;
for (int a = i; a < i + 8; a++) {
for (int b = j; b < j + 8; b++) {
if ((a + b) % 2 == 0) {
if (C[a][b] == 'B')
cntW++;
else
cntB++;
}
else {
if (C[a][b] == 'B')
cntB++;
else
cntW++;
}
}
}
min = minF(min, cntB);
min = minF(min, cntW);
}
}
printf("%d\n", min);
}
코드 설명
#브루트포스 알고리즘
main() {
int N, M;
scanf("%d %d", &N, &M);
int C[52][52];
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf("%s", C[i][j]);
}
}
int count = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (C[i][j] == C[i][j + 1])
count++;
}
}
}
처음에는 뭘 어떻게 해야 할지 감도 안 왔다.
#include <stdio.h>
#include <string.h>
char white[8][8] = { "WBWBWBWB","WBWBWBWB","WBWBWBWB","WBWBWBWB",
"WBWBWBWB","WBWBWBWB","WBWBWBWB","WBWBWBWB" };
char black[8][8] = { "BWBWBWBW","BWBWBWBW","BWBWBWBW","BWBWBWBW",
"BWBWBWBW","BWBWBWBW","BWBWBWBW","BWBWBWBW" };
char C[52][52];
int whitefirst(int x, int y) {
int count = 0;
for (int i = x; i < x + 8; i++) {
for (int j = y; j < y + 8; j++) {
if (C[i][j] != white[i - x][j - y])
count++;
}
}
return count;
}
int blackfirst(int x, int y) {
int count = 0;
for (int i = x; i < x + 8; i++) {
for (int j = y; j < y + 8; j++) {
if (C[i][j] != black[i - x][j - y])
count++;
}
}
return count;
}
int min(int a, int b) {
if (a >= b)
return b;
else
return a;
}
main() {
int N, M;
int result;
scanf("%d %d", &N, &M);
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf("%s", &C[i][j]);
}
}
for (int i = 0; i + 7 < N; i++) {
for (int j = 0; j + 7 < M; j++) {
result = min(whitefirst(N, M), blackfirst(N, M));
}
}
printf("%d", result);
}
① 그래서 찾아봤더니 처음 시작할 때 맨 왼쪽 위 칸이 흰색인 경우와 검은색인 경우를 정해놓고 두 가지 경우와 비교하면서 count를 세는 방법도 있고,
↓↓↓ 참고한 사이트
백준 1018번 체스판 다시 칠하기
문제 링크입니다: https://www.acmicpc.net/problem/1018 체스판은 (0,0)에 W가 오는 경우가 있고 B가 오는 경우가 있습니다. 따라서 두 가지 경우의 체스판을 미리 선언해놓고 하나하나 Brute Force 방식으로
jaimemin.tistory.com
② 인덱스를 이용해서 0인 구역과 1인 구역을 나누어서 따로 count를 세고 마지막에 최소값을 구하는 방법이 있다. 처음에는 이 방법 자체가 이해가 안돼서 위에 방법으로 시도해보려고 했으나 실패했다. 사실 아직도 잘 모르겠다..★★
↓↓↓ 참고한 사이트
[C 언어] 백준 1018. 체스판 다시 칠하기
1018. 체스판 다시 칠하기 (누르면 해당 문제로 이동) N번째 종말의 수가 나올 때까지 차례대로 시도하는 문제 제약사항) 시간 : 2 초 메모리 : 128 MB 문제) 지민이는 자신의 저택에서 MN개의 단위 정
mjeong9316.tistory.com
hydroponicglass.tistory.com/31
백준 1018 체스판 다시 칠하기
문제 : https://www.acmicpc.net/problem/1018 1018번: 체스판 다시 칠하기 첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의.
hydroponicglass.tistory.com
2차원 배열 초기화
blog.naver.com/1stwook/30182859109
2차원 배열과 포인터배열(2차원 문자배열)
이번에는 여러 개의 문자열을 처리하기 위한 2차원의 문자배열을 살펴볼거에요.하나의 문자열을 저장하기 ...
blog.naver.com
문제 출처
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
'C' 카테고리의 다른 글
#52. [백준_C언어] 1920 : 수 찾기 (0) | 2021.01.27 |
---|---|
#51. [백준_C언어] 1181 : 단어 정렬 (0) | 2021.01.27 |
#49. [백준_C언어] 2740 : 행렬 곱셈 (0) | 2021.01.26 |
#48. [백준_C언어] 5086 : 배수와 약수 (0) | 2021.01.25 |
#47. [백준_C언어] 2750 : 수 정렬하기 (0) | 2021.01.25 |