1018번: 체스판 다시 칠하기 [Python]

백준 알고리즘의 11050문제이다.


  1. 일단 되게는 하자
# 입력
y, x = map(int, input().split(" "))
board = []
for i in range(y):
    board.append(input())

# 대조군 생성
contrast_W = []
contrast_B = []

for i in range(y):
    tmpstring = ""
    for j in range(x):
        if i % 2 == 1:        
            if j % 2 == 1:  # 홀수
                tmpstring += "W"
            if j % 2 == 0:  # 짝수
                tmpstring += "B"
        else:   
            if j % 2 == 1:  # 홀수
                tmpstring += "B"
            if j % 2 == 0:  # 짝수
                tmpstring += "W"

    contrast_W.append(tmpstring)

for i in range(y):
    tmpstring = ""
    for j in range(x):
        if i % 2 == 1:        
            if j % 2 == 1:  # 홀수
                tmpstring += "B"
            if j % 2 == 0:  # 짝수
                tmpstring += "W"
        else:   
            if j % 2 == 1:  # 홀수
                tmpstring += "W"
            if j % 2 == 0:  # 짝수
                tmpstring += "B"
    contrast_B.append(tmpstring)

# 입력된 체스판과 대조군과 비교하여 비교체스판 생성

compare_W = []
compare_B = []

for i in range(y):
    tmplist = []
    for j in range(x):
        if board[i][j] == contrast_W[i][j]:
            tmplist.append(0)
        else:
            tmplist.append(1)
    compare_W.append(tmplist)

for i in range(y):
    tmplist = []
    for j in range(x):
        if board[i][j] == contrast_B[i][j]:
            tmplist.append(0)
        else:
            tmplist.append(1)
    compare_B.append(tmplist)

# 최솟값구하기

result = 65
for i in range(x - 7):
    for j in range(y - 7):
        tmpresult = 0
        for k in range(8):
            tmpresult += sum(compare_W[j + k][i:i + 8])
        if result > tmpresult:
            result = tmpresult

for i in range(x - 7):
    for j in range(y - 7):
        tmpresult = 0
        for k in range(8):
            tmpresult += sum(compare_B[j + k][i:i + 8])
        if result > tmpresult:
            result = tmpresult

print(result)

입력 값을 받는다.
입력된 크기에 해당하는 체스판 2개를 만든다.
입력된 보드와 체스판을 비교하여, 일치하는 부위는 0, 일치하지 않는 부위는 1으로 두 개의 비교판을 만든다.
두 비교판에서 88의 크기를 단위로 모든 경우의 수에서의 최솟값을 구한다.
예를들어, 10
10보드

WBWBWBWBWB
BWBWBWBWBW
WBWBWBWBWB
BWBBBWBWBW
WBWBWBWBWB
BWBWBWBWBW
WBWBWBWBWB
BWBWBWBWBW
WBWBWBWBWB
BWBWBWBWBW

가 입력되면,

0000000000
0000000000
0000000000
0001000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000

로 만든 다음, 볼드체로 표시한 틀(체스판 크기) 안의 수를 합한다. 이를 이를 볼드체가 아닌 부분으로 옮겨가며 반복하여 합의 최솟값을 구하여 출력한다.

대조군 체스판을 굳이 만들지 않고 바로 비교 체스판을 생성하면 더 효율적일 것 같다.
일단 되게는 만들자는 생각으로 제출했는데, 통과했다.

좋은 웹페이지 즐겨찾기