본문 바로가기
백준 알고리즘(BOJ)

백준 알고리즘 1018 (체스판 다시 칠하기) - python (재풀이)

by Think_why 2022. 6. 24.

백준 알고리즘 1018 (체스판 다시 칠하기) - python

> https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

 

W 또는 B로 시작하는 격자 무늬 체스판 다시 칠하기!

8 x 8의 판을 이용한다는 특징이 있다.

 

[문제 해결]

1. 최소값 _min은 8 x 8  64로 설정

2. 8 x 8의 기준이 될 좌상단 index를 기준으로 하는 i, j for문

3. (0,0)이 W라고 가정하고 틀린 경우를 cnt에 누적한다.

    정반대의 경우는 64 - cnt가 알아서 세지는 방식이다.

4. cnt와 64-cnt를 비교하여 작은 수 cnt_min을 찾는다.

5. 최종적으로 _min과 cnt_min을 비교하여 작은 수를 출력.

 

import sys
N, M = map(int, sys.stdin.readline().split())
_map = [sys.stdin.readline().rstrip() for _ in range(N)]
_min = 64  # 최대 8 x 8

for i in range(N-7):
    for j in range(M-7):
        cnt = 0
        # (0,0)이 W인 경우로 가정
        for k in range(8):
            for l in range(8):
                # 틀린 경우만 체크
                if (k + l) % 2 == 0:
                    if _map[i + k][j + l] == 'B':  # W이어야 하는데 B인 경우
                        cnt += 1
                else:
                    if _map[i + k][j + l] == 'W':  # B이어야 하는데 W인 경우
                        cnt += 1
        cnt_min = min(cnt, 64 - cnt)  # 틀린 경우와, 그 반전의 경우
        if _min > cnt_min:
            _min = cnt_min
print(_min)
728x90

댓글