이우의 개발일지
[C/C++] 백준 1018번 체스판 다시 칠하기 - (1) 본문
백준 1018번 체스판 다시 칠하기 문제
이 문제는 체스판 같은 N*N 판이나 일반적인 N*M의 표를 공략하는 문제가 있을 때 쓰면 좋을 것 같은 팁이 있다.
위의 표를 보면 B와 W가 번갈아 칠해져야하며, 위 아래 역시 번갈아 칠해져있어야 한다.
빨간 색 부분의 숫자를 보면 결국에는 행과 열의 합이 일정하다. 이 말이 무슨 말이냐면 행과 열의 합이 (0,0)이 만약에 B라고 했을 때 행과 열의 합이 항상 짝수일 때는 B가 나온다. 반대로 (0,1)이 W라고 하면 행과 열의 합이 항상 홀수가 나온다.
즉, B와 W처럼 일정한 간격으로 입력해야할 때 행과 열의 합이 짝수인지 홀수 인지 맞춰서 해주면 된다.
체스판 다시칠하기 전체 코드
#include <iostream>
using namespace std;
char chass[51][51];
//int real[51][51];
int main() {
int N, M;
cin >> N >> M;
int minn = 1000000;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
char ch1;
cin >> ch1;
chass[i][j] = ch1;
}
}
for (int p = 1; p <= N - 7; p++) {
for (int o = 1; o <= M - 7; o++) {
for (int k = 0; k < 2; k++) {
int result = 0;
char expected_2;
char expected_1;
if (k == 0) {
expected_2 = 'W';
expected_1 = 'B';
}
else {
expected_2 = 'B';
expected_1 = 'W';
}
for (int i = p; i <= p + 7; i++) {
for (int j = o; j <= o + 7; j++) {
if ((i + j) % 2 == 0) {
if (chass[i][j] != expected_1) result++;
}
else if ((i + j) % 2 == 1) {
if (chass[i][j] != expected_2) result++;
}
}
}
if (result < minn) minn = result;
}
}
}
cout << minn;
return 0;
}
반응형
'Coding' 카테고리의 다른 글
[C/C++] 백준 1654번 랜선 자르기 / 이분 탐색 알고리즘 - (1) (0) | 2024.10.20 |
---|---|
[C/C++] 백준 11651번 좌표 정렬하기2 -(1) (0) | 2024.10.08 |
[C/C++] 백준 줄 세우기 2252번 / 위상 정렬 알고리즘 (0) | 2024.09.30 |
[백준/C++] 잃어버린 괄호 풀이 1541번 /그리디/알고리즘/코딩테스트 - (1) (0) | 2024.08.05 |
[Anaconda] 콘다 가상환경 생성 및 실행 방법/ window(윈도우)/ cmd (0) | 2024.06.30 |