백준_1018번

정소담·2023년 2월 5일
0

BOJ Short Review

목록 보기
28/44
post-thumbnail

1018번 체스판 다시 칠하기

M x N 크기의 보드에서 8 x 8 크기 영역을 정해
그중 체스판처럼 다시 칠할 경우 제일 적게 칠하는 경우를 구하는 문제

n,m = map(int,input().split()) # N * M 크기 입력
board = [list(input()) for i in range(n)] 
# 한줄 씩 입력받는 보드의 색을 2차원 리스트로 만들었다. ('W'=흰 색, 'B'=검은색)
color = [] # 보드의 영역 중 나올 수 있는 모든 8*8 사이즈의 영역에서
# 새로 칠하는 횟수를 기록하기 위해 빈 리스트를 만들었다.

for a in range(n-7): # 기준점을 기준으로 오른쪽으로 7칸
    for b in range(m-7): # 아래로 7칸의 영역을 정하기 위해 -7 만큼 순회한다.
        cnt = 0 # 기준점이 바뀔 때마다 카운트를 리셋
        for x in range(a,a+8): # 세로줄 8줄
            for y in range(b,b+8): # 가로줄 8줄 
                if ((x+y) % 2 == 0 and board[x][y]=='W') or \
                ((x+y) % 2 == 1 and board[x][y]=='B'):
# 기준점의 색이 'B' 일 경우 짝수 줄의 홀수 칸 또는 홀수 줄의 짝수 칸 이 W 이거나
# 짝수 줄의 짝수 또는 홀수 줄의 홀수 칸이 B 이면 cnt + 1 로 횟수 누적
                    cnt += 1
        color.append(min(cnt,64-cnt))
# 기준점이 'B' 일 경우 칠해야 하는 횟수 와 기준점이 'W'일 경우 칠해야 하는 횟수 중
# 적게 칠하는 경우를 리스트에 기록 
# (8*8 의 영역은 총 64칸이고 반대의 경우를 생각해 64에서 카운트 횟수를 빼주었다.)
print(min(color)) # 기록 중 가장 작은 값을 출력

기준점이 'B' 인 체스판을 이미지화 해서 이해해 봤다.
기준점은 주어지는 M x N (열 x 행) 영역안 중 모든 8 x 8 영역이 확인 될 때까지 오른쪽으로 한칸씩 그리고 그 다음줄 이런식으로 이동하게 했다.

profile
Hi ! I'm newbie :)

0개의 댓글