[Python] 백준 - 1018 - 체스판 다시 칠하기

강주형·2022년 7월 31일
0

백준 알고리즘

목록 보기
8/14

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

N, M = map(int, input().split())

org_board = []

for i in range(N):
    X = tuple(input())
    org_board.append(X)

answer_list = []

for i_row in range(len(org_board)-7):
    board = org_board[i_row:i_row+8]
    for i_col in range(len(board[0])-7):
        answer = 0
        if board[0][i_col] == 'W': # 왼쪽 상단이 'W'
            for j in range(0, 8, 2): # 짝수행
                for k in range(i_col,i_col+8): # 지금 행의 열 하나하나 탐색
                    if (k-i_col) % 2 == 0 and board[j][k] == 'B': # 짝수열이면서 'B'
                        answer += 1
                    if (k-i_col) % 2 == 1 and board[j][k] == 'W': # 홀수열이면서 'W'
                        answer += 1
            for j in range(1, 8, 2): # 홀수행
                for k in range(i_col,i_col+8): # 지금 행의 열 하나하나 탐색
                    if (k-i_col) % 2 == 0 and board[j][k] == 'W': # 짝수열이면서 'W'
                        answer += 1
                    if (k-i_col) % 2 == 1 and board[j][k] == 'B': # 홀수열이면서 'B'
                        answer += 1 

        elif board[0][i_col] == 'B': # 왼쪽 상단이 'B'
            for j in range(0, 8, 2): # 짝수행
                for k in range(i_col,i_col+8): # 지금 행의 열 하나하나 탐색
                    if (k-i_col) % 2 == 0 and board[j][k] == 'W': # 짝수열이면서 'W'
                        answer += 1
                    if (k-i_col) % 2 == 1 and board[j][k] == 'B': # 홀수열이면서 'B'
                        answer += 1
            for j in range(1, 8, 2): # 홀수행
                for k in range(i_col,i_col+8): # 지금 행의 열 하나하나 탐색
                    if (k-i_col) % 2 == 0 and board[j][k] == 'B': # 짝수열이면서 'B'
                        answer += 1
                    if (k-i_col) % 2 == 1 and board[j][k] == 'W': # 홀수열이면서 'W'
                        answer += 1 
        answer_list.append(answer)
        
print(min(answer_list))

5시간 넘게 걸렸는데 계속 실패..

확인해보니

9 23
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBW

이런 예시에서
왼쪽 상단이 아니라 오른쪽 하단에서부터 탐색을 시작하면 더 최소화할 수 있는 값이 있는데 이걸 못 찾는 듯
다음에 다시 해보기


n, m = map(int, input().split())
board = []

for i in range(n):
    board.append(input())
    
answer = []
for a in range(n-7):
    for b in range(m-7):
        count1 = 0
        count2 = 0
        for i, brd in enumerate(board[a:a+8]):
            for j, br in enumerate(brd[b:b+8]):
                if (i + j) % 2 == 0 and br == 'W':
                    count1 += 1
                elif (i + j) % 2 == 1 and br == 'B':
                    count1 += 1
                elif (i + j) % 2 == 0 and br == 'B':
                    count2 += 1
                elif (i + j) % 2 == 1 and br == 'W':
                    count2 += 1
        answer.append(count1)
        answer.append(count2)
print(min(answer))
9 23
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBW
31

해결 완료

두 경우의 count 변수를 개별로 해서 최솟값을 도출함

profile
Statistics & Data Science

0개의 댓글