[BOJ/1018] 체스판 다시 칠하기 #완전탐색 #체스판
2025. 5. 20. 01:21ㆍ_Study/Baekjoon
728x90
#알고리즘 #백준 #프로그래머스
✅ 문제 설명
✅ 해결 방법
✅ 발생한 문제와 방안
✅ 최종적인 해결 방법
✅ 최적화 방안
그래서 오늘의 TIL(Today I Learned) 학습 키워드
✨ 완전탐색
✨ 체크판
✅ 문제
백준 실버4 난이도인 체스판 다시 칠하기 문제로 ✨완전탐색, 전수조사를 통한 최소 연산 구현✨ 방법을 알아보겠습니다.
https://www.acmicpc.net/problem/1018
✅ 문제 설명
백준 1018번 체스판 다시 칠하기
가로 × 세로가 N × M인 체스판이 주어진다. 체스판은 흰색(W)과 검은색(B)으로만 이루어져 있다. 이 중 8×8 크기의 보드를 잘라냈을 때, 다시 체스판 규칙에 맞게 칠해야 하는 최소의 칸 수를 구하는 문제다.
✅ 해결 방법
- 8×8 구간을 모두 순회하며 탐색
- 각 시작점(i, j)부터 8×8 보드를 자르고,
- “W로 시작하는 체스판”과 “B로 시작하는 체스판”으로 각각 비교
- (i + j) % 2를 이용하면 현재 위치의 색이 어떤 색이어야 하는지 판단 가능
- 각 8×8 영역마다 다시 칠해야 하는 칸 수를 최소화하며 전체 답을 갱신
✅ 발생한 문제와 방안
초기에는 slice
를 사용하여 8x8 보드를 잘라서 각각 if문으로 비교하는 방식으로 작성했는데, i, j
짝수/홀수에 따라 분기가 많아 가독성이 떨어졌습니다.
그래서 (i + j) % 2
를 이용하여 패턴을 수학적으로 일반화하고, 복잡한 조건문 없이도 시작 색만 바꾸면 비교가 가능한 구조로 리팩토링했습니다.
✅ 최종적인 해결 방법
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const solution = () => {
const [N, M] = input[0].split(" ").map(Number);
const chess_board = input.slice(1);
let answer = 64;
const count_check_board = (startRow, startCol) => {
let mismatchW = 0;
let mismatchB = 0;
for (let i = 0; i < 8; i++) {
for (let j = 0; j < 8; j++) {
const expectedW = (i + j) % 2 === 0 ? "W" : "B";
const expectedB = (i + j) % 2 === 0 ? "B" : "W";
const actual = chess_board[startRow + i][startCol + j];
if (actual !== expectedW) mismatchW++;
if (actual !== expectedB) mismatchB++;
}
}
return Math.min(mismatchW, mismatchB);
};
for (let i = 0; i <= N - 8; i++) {
for (let j = 0; j <= M - 8; j++) {
const current_count = count_check_board(i, j);
answer = Math.min(current_count, answer);
}
}
return answer;
};
console.log(solution());
✅ 최적화 방안
slice()
대신chess_board[startRow + i][startCol + j]
직접 인덱싱으로 메모리 효율 증가(i + j) % 2
패턴으로 중복 조건 없이 간결한 구현- 8×8 블록만 확인하므로 시간 복잡도는 O((N-7)*(M-7) * 64) → 완전탐색으로 충분히 가능
✨ 오늘의 TIL(Today I Learned)
(i + j) % 2
를 활용해 체스판 패턴 비교 로직을 간단하게 구현할 수 있다.- 이와 같은 방식은 격자형 패턴이 반복되는 모든 문제에 일반화할 수 있어 매우 유용하다.
- 완전탐색에서도 패턴화와 인덱스 직접 접근만으로도 코드 품질을 확 높일 수 있다.
--- AI로 작성한 실험적인 글입니다.
'_Study > Baekjoon' 카테고리의 다른 글
[BOJ / 14889] 스타트와 링크 | 팀 조합 문제 #조합 #완전탐색 (0) | 2025.05.20 |
---|---|
[BOJ / 9663] 백트래킹 느렸다면? 비트마스크로 최적화하는 N-Queen 문제 #비트마스크 #백트래킹 (0) | 2025.05.20 |
🐍 Python vs 🟨 JavaScript 클래스 메서드 비교 @classmethod, static (1) | 2025.04.15 |
[PGS] 멀리뛰기 최적화, DFS 완전탐색, 동적계획법(DP) #99클럽11일차 #TIL (0) | 2024.04.10 |
[PGS] 최댓값과 최솟값, 음수 문자열 정렬 #99클럽10일차 #TIL (1) | 2024.04.09 |