티스토리 뷰
반응형
🧩 백준 1018번 - 체스판 다시 칠하기
✨ 목표
- N × M 크기의 보드에서 8 × 8 크기의 체스판을 하나 잘라내어,
- 다시 칠해야 할 칸의 수가 가장 적은 경우를 구합니다.
🔍 체스판 조건
- 인접한 칸은 색이 달라야 합니다.
- 가능한 체스판의 패턴은 다음 두 가지입니다:
- 왼쪽 위가 'W'로 시작하는 체스판
- 왼쪽 위가 'B'로 시작하는 체스판
🧪 첫 번째 코드 (초기 버전)
N, M = map(int, input().split())
arr = [['' for _ in range(50)] for _ in range(50)]
arr2 = [['' for _ in range(8)] for _ in range(8)]
arr3 = [['' for _ in range(8)] for _ in range(8)]
check1 = 0
check2 = 0
min_check = 50000
for i in range(N):
line = input()
for j in range(M):
arr[i][j] = line[j]
# arr2: 'W'로 시작하는 체스판 만들기
for i in range(8):
for j in range(8):
if i % 2 == 0 and j % 2 == 0:
arr2[i][j] = 'W'
elif i % 2 == 0 and j % 2 != 0:
arr2[i][j] = 'B'
elif i % 2 != 0 and j % 2 == 0:
arr2[i][j] = 'B'
else:
arr2[i][j] = 'W'
# arr3: 'B'로 시작하는 체스판 만들기
for i in range(8):
for j in range(8):
if i % 2 == 0 and j % 2 == 0:
arr3[i][j] = 'B'
elif i % 2 == 0 and j % 2 != 0:
arr3[i][j] = 'W'
elif i % 2 != 0 and j % 2 == 0:
arr3[i][j] = 'W'
else:
arr3[i][j] = 'B'
# 모든 8x8 영역을 검사
for k in range(N - 7):
for p in range(M - 7):
check1 = 0
check2 = 0
for i in range(8):
for j in range(8):
if arr[k + i][p + j] != arr2[i][j]:
check1 += 1
if arr[k + i][p + j] != arr3[i][j]:
check2 += 1
if check1 < check2:
local_check = check1
else:
local_check = check2
if min_check > local_check:
min_check = local_check
print(min_check)
✅ 특징
- 체스판 패턴(
arr2,arr3)을 미리 생성해두고 - 각 8x8 영역과 두 패턴을 직접 비교하여 다시 칠해야 하는 칸 수를 계산합니다.
- 중복 코드가 많고, 구조가 다소 복잡합니다.
🔁 두 번째 코드 (리팩토링 버전)
# 입력받기
N, M = map(int, input().split())
arr = []
for i in range(N):
a = input()
arr.append(a)
min_check = 64
for k in range(N - 7):
for o in range(M - 7):
check_W = 0
check_B = 0
for i in range(8):
for j in range(8):
current = arr[k + i][o + j]
expect1 = ''
expect2 = ''
if (i + j) % 2 == 0:
expect1 = 'W'
else:
expect1 = 'B'
if (i + j) % 2 == 0:
expect2 = 'B'
else:
expect2 = 'W'
if current != expect1:
check_W += 1
if current != expect2:
check_B += 1
local_min = min(check_W, check_B)
min_check = min(min_check, local_min)
print(min_check)
✅ 개선 포인트
- 체스판을 따로 만들지 않고, (i+j)의 짝/홀수로 패턴을 바로 계산합니다.
arr2,arr3제거 → 메모리 낭비 줄임if-else구조 간결화- 전체 코드가 훨씬 직관적이며 간결해졌습니다.
📊 두 코드 비교 요약
| 항목 | 첫 번째 코드 | 두 번째 코드 |
|---|---|---|
| 체스판 패턴 저장 | arr2, arr3 배열 생성 |
계산으로 즉시 판별 |
| 반복 구조 | 중복 많음 | 단순화 |
| 가독성 | 복잡 | 간결 |
| 메모리 사용 | 배열 3개 사용 | 최소 사용 |
| 성능 측면 | 다소 느림 | 더 빠름 |
🏁 결론
첫 번째 코드는 문제를 직접 구현한 초기형 설계이고,
두 번째 코드는 패턴 성질을 활용하여 효율적으로 바꾼 리팩토링 버전입니다.
두 코드 모두 정확히 동작하지만,
두 번째 코드가 구조, 성능, 가독성 면에서 더 우수합니다.
반응형
'백준 스터디' 카테고리의 다른 글
| 🧾 백준 2563번 색종이 문제 풀이 정리, Python (0) | 2025.06.01 |
|---|---|
| 색종이 넓이 계산 백준 2563, C++ (0) | 2025.06.01 |
| 백준 1018 체스판 다시 칠하기 C++ (1) | 2025.05.30 |
| 백준 2798 블랙잭 파이썬, C++ (0) | 2025.05.29 |
| 백준 11653 소인수분해 파이썬 풀이 (0) | 2025.05.27 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 동적계획법
- 브루트포스
- 문자열처리
- Python
- 그리디알고리즘
- 프로그래머스
- C++
- 알고리즘문제풀이
- HTML
- 객체지향
- 코딩 테스트
- 코딩
- 알고리즘
- 그래프 탐색
- 파이썬코딩
- 알고리즘 문제풀이
- 문제 풀이
- 상속
- 알고리즘기초
- 문제풀이
- dfs
- python 알고리즘
- 프로그래밍
- c언어
- 동적 계획법
- 코딩테스트
- 백준
- DP
- 그리디
- 파이썬
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
글 보관함
반응형