티스토리 뷰

반응형
백준 1018번 - 체스판 다시 칠하기

🧩 백준 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개 사용 최소 사용
성능 측면 다소 느림 더 빠름



🏁 결론

첫 번째 코드는 문제를 직접 구현한 초기형 설계이고,
두 번째 코드는 패턴 성질을 활용하여 효율적으로 바꾼 리팩토링 버전입니다.

두 코드 모두 정확히 동작하지만,
두 번째 코드가 구조, 성능, 가독성 면에서 더 우수합니다.




반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/11   »
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
글 보관함
반응형