Algorithm
[백준 - 1018번] 체스판 다시 칠하기
1984
2022. 1. 22. 20:46
- 2차원 벡터
- 체스판 돌려가면서 체크했다. (간단하게 하는 방법이 있을 것 같기도 하다.)
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(void)
{
int M, N;
// 몇 칸 짜리 보드인지
cin >> M >> N;
//2차원 벡터 생성 후 -> 보드 상태 넣어준다.
vector <vector<char>> origin_board;
for (int i = 0; i < M; i++)
{
char c;
vector <char> line;
for (int j = 0; j < N; j++)
{
cin >> c;
line.push_back(c);
}
origin_board.push_back(line);
}
// 색을 바꿔야 하는 횟수
int count;
// 바꿔야 하는 숫자 최솟값
int min_count = 2500;
// 시작 위치 설정
char first_space;
char second_space;
for (int o_i = 0; o_i < M; o_i++)
{
// 자를 사이즈가 나오는지 확인하기
if (o_i + 8 > M) break;
for (int o_j = 0; o_j < N; o_j++)
{
// 자를 사이즈가 나오는지 확인하기
if (o_j + 8 > N) break;
// 기준 공간에서 시작해서 8X8 확인한다. count 초기화
// 체스판을 돌려가면서 확인한다.
count = 0;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
second_space = origin_board[o_i + i][o_j + j];
if (i == 0 && j == 0)
{
// 기준 공간
first_space = second_space;
}
else
{
//기준 공간이랑 비교해서 다르면 count up 해야함.
if (first_space != second_space) count++;
}
//기준 공간 설정 (다음 줄로 넘어갈 때 예외입니다.)
if (j == 7) continue;
if (first_space == 'B') first_space = 'W';
else if (first_space == 'W') first_space = 'B';
}
}
if (count < min_count) min_count = count;
count = 0;
for (int j = 7; j >= 0; j--)
{
for (int i = 0; i < 8; i++)
{
second_space = origin_board[o_i + i][o_j + j];
if (i == 0 && j == 7)
{
// 기준 공간
first_space = second_space;
}
else
{
//기준 공간이랑 비교해서 다르면 count up 해야함.
if (first_space != second_space) count++;
}
//기준 공간 설정 (다음 줄로 넘어갈 때 예외입니다.)
if (i == 7) continue;
if (first_space == 'B') first_space = 'W';
else if (first_space == 'W') first_space = 'B';
}
}
if (count < min_count) min_count = count;
count = 0;
for (int j = 0; j < 8; j++)
{
for (int i = 7; i >= 0; i--)
{
second_space = origin_board[o_i + i][o_j + j];
if (i == 7 && j == 0)
{
// 기준 공간
first_space = second_space;
}
else
{
//기준 공간이랑 비교해서 다르면 count up 해야함.
if (first_space != second_space) count++;
}
//기준 공간 설정 (다음 줄로 넘어갈 때 예외입니다.)
if (i ==0) continue;
if (first_space == 'B') first_space = 'W';
else if (first_space == 'W') first_space = 'B';
}
}
if (count < min_count) min_count = count;
count = 0;
for (int i = 7; i >= 0; i--)
{
for (int j = 7; j >= 0; j--)
{
second_space = origin_board[o_i + i][o_j + j];
if (i == 7 && j == 7)
{
// 기준 공간
first_space = second_space;
}
else
{
//기준 공간이랑 비교해서 다르면 count up 해야함.
if (first_space != second_space) count++;
}
//기준 공간 설정 (다음 줄로 넘어갈 때 예외입니다.)
if (j == 0) continue;
if (first_space == 'B') first_space = 'W';
else if (first_space == 'W') first_space = 'B';
}
}
if (count < min_count) min_count = count;
}
}
cout << min_count;
return 0;
}
[참고 자료]
728x90