-
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 댓글