-
1018.체스판 다시 칠하기알고리즘/백준 BAEK JOON 2020. 5. 4. 16:27
(*)이번에 풀어볼 문제는 백준의 1018 체스판 다시 칠하기이다.
이전에 풀었던 막대기처럼 정해진 비교대상이 있을 경우 비교 기준을 만들어놓고 비교해가는 방법을 사용했다.
하지만.... 푸는 방법은 알겠는데.. 구현을 못했다...
그래서 결국 블로그에서 내 생각과 비슷하게 생각한 분의 풀이를 찾다가 발견하여 그냥 이분의 풀이를 보고 공부하기로 했다...
푸는 방법은 생각해냈는데 이분처럼 구현을 못하는거 보면 아직 멀었다..허허..
심지어 코드를 보고도 이해하는데도 시간이 걸렸다... 너무 헷갈린다...
참고 블로그 글 : https://jaimemin.tistory.com/667
< Code 설명 >
#include <iostream> #include <algorithm> using namespace std; #define MAX 50 string w_s[8] = { "WBWBWBWB", "BWBWBWBW", "WBWBWBWB", "BWBWBWBW", "WBWBWBWB", "BWBWBWBW", "WBWBWBWB", "BWBWBWBW" }; string b_s[8] = { "BWBWBWBW", "WBWBWBWB", "BWBWBWBW", "WBWBWBWB", "BWBWBWBW", "WBWBWBWB", "BWBWBWBW", "WBWBWBWB",}; char map[MAX][MAX]; // 체스판 배열 int n, m; // 입력받을 체스판 크기 변수 int w(int st, int base){ // 시작이 white 일때 int result = 0; // 고쳐야할 갯수 변수 for (int i = st; i < st + 8; i++){ for (int j = base; j < base + 8; j++){ if (map[i][j] != w_s[i-st][j-base]) //기준판은 8x8이므로 result++; } } return result; } int b(int st, int base){ // 시작이 black 일때 int result = 0; // 고쳐야할 갯수 변수 for (int i = st; i < st + 8; i++){ for (int j = base; j < base + 8; j++){ if (map[i][j] != b_s[i-st][j-base]) //기준판은 8x8이므로 result++; } } return result; } int main() { cin >> n >> m; for (int i = 0; i < n; i++){ for (int j = 0; j < m; j++) cin >> map[i][j]; // 체스판 입력받음 } int ans = 9999999; for (int i = 0; i + 7 < n; i++){ // 세로의 탐색 가동범위를 정함 for (int j = 0; j + 7 < m; j++) // 가로의 탐색 가동범위를 정함 ans = min(ans,min(w(i,j),b(i,j))); // 최소값을 구함 } cout << ans << "\n"; return 0; }
# 구현에 있어 주의할 점은 비교대상은 8x8이기 떄문에 배열의 인덱스를 잘생각해서 비교해주어야한다.
-> 아무생각없이 비교대상의 인덱스를 따라가면 당연히 배열 범위를 초과하기 때문에 에러가 발생함
반응형'알고리즘 > 백준 BAEK JOON' 카테고리의 다른 글
1138.한 줄로 서기 (0) 2020.05.17 1120.문자열 (0) 2020.05.17 14891.톱니바퀴 (0) 2020.05.01 1057.토너먼트 (0) 2020.05.01 1094.막대기 (0) 2020.04.26 댓글