-
728x90
* 접근한 방식
- 8*8의 네모칸을 N*M의 네모 안에서 우측 혹은 하단으로 이동하며 검사
- 8*8의 네모칸의 (0,0)가 B인지 W인지를 start변수에 저장한 후, 8*8안의 각각의 행과 열을 검사char start = board[i][j];
(8*8사각형 기준)
☞ 행, 열은 8*8사각형의 행과 열을 의미)
- 행이 짝수인 경우,
└ 열이 짝수면, start와 같아야함.
따라서 start와 다른 경우 고쳐야하므로 num++
└ 열이 홀수면, start와 달라야함.
따라서 start와 같은 경우 고쳐야하므로 num++- 행이 홀수인 경우,
└ 열이 짝수면, start와 달라야함.
따라서 start와 같은 경우 고쳐야하므로 num++
└ 열이 홀수면, start와 같아야함.
따라서 start와 다른 경우 고쳐야하므로 num++* 생각하지 못한 점
- (0,0)을 기준으로하여 나머지칸들을 고쳤으나 (0,0)만 고치면 되는 경우가 있을 수도 있음
☞ (0,0)이 'B이어야 할 때'와 'W이어야 할 때'의 경우의 수를 모두 세서,
둘 중 작은 것을 그 8*8사각형에서의 최소 변화 횟수로 하자#include <iostream>#include <string>#include <vector>using namespace std;int main() {int N, M;cin >> N >> M;vector<string> board(N);int result = 0;// 각 칸의 색 입력받기for (int i = 0; i < N; i++){cin >> board[i];}// 8*8네모의 이동for (int i = 0; i <= N-8; i++){for (int j = 0; j <= M - 8; j++){char start = 'B';int num = 0;// 네모 안에 틀린색 개수 체크for (int r = 0; r < 8; r++)for (int c = 0; c < 8; c++){if (r % 2 == 0){if (c % 2 != 0){if (start == board[i + r][j + c])num++;}else{if (start != board[i + r][j + c])num++;}}else{if (c % 2 != 0){if (start != board[i + r][j + c])num++;}else{if (start == board[i + r][j + c])num++;}}}if (i == 0 && j == 0)result = num;else if (num < result)result = num;start = 'W';num = 0;// 네모 안에 틀린색 개수 체크for (int r = 0; r < 8; r++)for (int c = 0; c < 8; c++){if (r % 2 == 0){if (c % 2 != 0){if (start == board[i + r][j + c])num++;}else{if (start != board[i + r][j + c])num++;}}else{if (c % 2 != 0){if (start != board[i + r][j + c])num++;}else{if (start == board[i + r][j + c])num++;}}}if (num < result)result = num;}}// 다시 칠해야 하는 개수cout << result;}- 코드가 좀... 반복이 많이 되는 것 같은데, 나중에 이걸 줄여봐야겠다.
데롱디롱희희.. (๑′ᴗ‵๑)
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[2108] 백준 : 통계학(C++) (0) 2020.04.30 [1436] 백준 : 영화감독 숌(C++) (0) 2020.04.27 [7568] 백준 : 덩치(C++) (0) 2020.04.27 [2231] 백준 : 분해합(C++) (0) 2020.04.27 [2798] 백준 : 블랙잭(C++) (0) 2020.04.27