728x90
https://www.acmicpc.net/problem/1018
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
#include <iostream>
#include <string>
#include <algorithm>
#include <utility>
using namespace std;
// 비교하고자 하는 문자열을 아예 저장을 한 후에 진행하였. 땨.
string WB[8] = {
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW"
};
string BW[8] = {
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB"
};
string input_arr[50];
int WB_check(int x, int y){
int cnt = 0;
for (int i = 0; i < 8; i++){
for (int j = 0; j < 8; j++){
if (input_arr[x + i][y + j] != WB[i][j])
cnt++;
}
}
return cnt;
}
int BW_check(int x, int y){
int cnt = 0;
for (int i = 0; i < 8; i++){
for (int j = 0; j < 8; j++){
if (input_arr[x + i][y + j] != BW[i][j])
cnt++;
}
}
return cnt;
}
int main() {
int cnt=0;
int redraw = 65;
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++)
cin >> input_arr[i];
for (int i = 0; i + 8 <= n; i++){
for (int j = 0; j + 8 <=m; j++){
int tmp;
tmp = min(WB_check(i, j), BW_check(i, j));
if (tmp < redraw) {
redraw = tmp;
}
}
}
cout << redraw;
return 0;
}
- 체스판이 놓여질 수 있는 경우는 단 두 경우이다.
- 1. Black으로 시작 2. White로 시작.
- 처음에는 탐색을 시작하는 첫 위치의 문자열을 가지고 판단을 하려 했으나 너무 귀찮기도 하고 번거롭기도 하고~ 어짜피 두 경우만 존재하기 때문에 애초에 비교 문자열을 저장한 후 시작하였다.
- 사용자로부터 입력받은 문자열에서 모든 경우의 8x8 사이즈 문자열 배열을 체스판을 만들 수 있는 두 가지 경우와 비교하며 redraw 수가 가장 작은 수를 저장, 출력한다.
문제를 읽고 알고리즘 설계 할 때 마다 느끼는 건데
이해는 참~ 잘 한다
명확한 포인트를 잡아서 구체화 하는게 매번 부족한 걸 느끼지만
문제 풀면 나아지겠지 머 ㅇㅅㅇ
오늘도 쪼은 하루
오쫀하!!!!
728x90
'🐣 알고리즘 삐약 > 💻 백준 삐약' 카테고리의 다른 글
28 삐약 : 백준 2577[바킹독 문제 풀이 | 배열 | JAVA] (0) | 2023.10.10 |
---|---|
27 삐약 : 백준 10808[바킹독 문제 풀이 | 배열 | JAVA] (0) | 2023.10.10 |
25 삐약 : 백준 7568[브루트 포스 | C++] (0) | 2022.06.28 |
24 삐약 : 백준 2231 [브루트 포스 | C++] (0) | 2022.06.28 |
23 삐약 : 백준 2798 [브루트 포스 | C++] (0) | 2022.06.28 |