용꿀
꼬마개발자허니
용꿀
전체 방문자
오늘
어제
  • 분류 전체보기 (247)
    • 개발 (74)
      • 스프링 입문 (7)
      • 스프링 기본 (9)
      • ToDo List using JPA (2)
      • 스프링 개념 (9)
      • 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 (8)
      • 스프링 MVC (3)
      • CS (18)
      • 개발 팁 (8)
      • 스프링 MSA (5)
      • 곰터뷰🐻 (5)
    • 알고리즘 (169)
      • 알고리즘 문제 풀이 (165)
    • 잡동사니 (1)
      • 노래 가사 (1)
hELLO · Designed By 정상우.
용꿀

꼬마개발자허니

(Python) 백준 1018번 - 체스판 다시 칠하기
알고리즘/알고리즘 문제 풀이

(Python) 백준 1018번 - 체스판 다시 칠하기

2023. 1. 2. 14:19

문제 링크 :  https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

풀이

브루트포스 문제이기 때문에 하나하나씩 계산하는 과정이 귀찮을 뿐 풀이가 어렵진 않았다.

import sys
def cnt_sqr(r, c, board, bw):  # 8*8로 체스판을 자른 후에 다시 칠해야하는 칸의 수 계산
    cnt = 0
    if bw == 'B':  # 8*8 체스판의 시작칸이 'B'인 경우
        for i in range(8):
            for j in range(8):
                # 'B'여야 하는 칸이지만 'W'가 칠해져 있는 경우 카운트 증가
                if (r+i) % 2 == 0 and (j+1) % 2 == 0 and board[r+i][c+j] == 'W':
                    cnt += 1
                # 'W'여야 하는 칸이지만 'B'가 칠해져 있는 경우 카운트 증가
                elif (r+i) % 2 == 0 and (j+1) % 2 != 0 and board[r+i][c+j] == 'B':
                    cnt += 1
                # 'W'여야 하는 칸이지만 'B'가 칠해져 있는 경우 카운트 증가
                elif (r+i) % 2 != 0 and (j+1) % 2 == 0 and board[r+i][c+j] == 'B':
                    cnt += 1
                # 'B'여야 하는 칸이지만 'W'가 칠해져 있는 경우 카운트 증가
                elif (r+i) % 2 != 0 and (j+1) % 2 != 0 and board[r+i][c+j] == 'W':
                    cnt += 1

    else:  # 8*8 체스판의 시작칸이 'W'인 경우
        for i in range(8):
            for j in range(8):
                # 'W'여야 하는 칸이지만 'B'가 칠해져 있는 경우 카운트 증가
                if (r+i) % 2 == 0 and (j+1) % 2 == 0 and board[r+i][c+j] == 'B':
                    cnt += 1
                # 'B'여야 하는 칸이지만 'W'가 칠해져 있는 경우 카운트 증가
                elif (r+i) % 2 == 0 and (j+1) % 2 != 0 and board[r+i][c+j] == 'W':
                    cnt += 1
                # 'B'여야 하는 칸이지만 'W'가 칠해져 있는 경우 카운트 증가
                elif (r+i) % 2 != 0 and (j+1) % 2 == 0 and board[r+i][c+j] == 'W':
                    cnt += 1
                # 'W'여야 하는 칸이지만 'B'가 칠해져 있는 경우 카운트 증가
                elif (r+i) % 2 != 0 and (j+1) % 2 != 0 and board[r+i][c+j] == 'B':
                    cnt += 1
    return cnt

n, m = map(int, sys.stdin.readline().split())
board = [] # 전체 체스판
for _ in range(n):
    row = list(sys.stdin.readline().strip())
    board.append(row)

min_b = 65 # 자른 체스판의 크기가 8*8이므로 65보다 카운트가 크게 나올 수는 없으므로 초기 최소값을 65로 설정
min_w = 65
for r in range(n-7): # 8*8로 자를 것이기 때문에 0 ~ n-8의 범위 내에서만 시작 칸을 잡을 수 있음
    for c in range(m-7):
        cnt_b = cnt_sqr(r, c, board, 'B') # 체스판의 시작칸이 'B'인 경우
        if cnt_b < min_b: # 기존 최소값보다 새로 계산한 값이 더 작으면 최소값 갱신
            min_b = cnt_b
        cnt_w = cnt_sqr(r, c, board, 'W') # 체스판의 시작칸이 'W'인 경우
        if cnt_w < min_w: # 기존 최소값보다 새로 계산한 값이 더 작으면 최소값 갱신
            min_w = cnt_w
print(min(min_b, min_w)) # 'B' 시작, 'W' 시작 둘 중 더 작은 값을 출력

'알고리즘 > 알고리즘 문제 풀이' 카테고리의 다른 글

(Python) 백준 2164번 - 카드 2  (0) 2023.01.04
(Python) 백준 1920번 - 수 찾기  (0) 2023.01.02
(Python) 백준 11866번 - 요세푸스 문제 0  (0) 2022.12.31
(Python) 백준 11651번 - 좌표 정렬하기 2  (0) 2022.12.30
(Python) 백준 11650번 - 좌표 정렬하기  (0) 2022.12.30
    '알고리즘/알고리즘 문제 풀이' 카테고리의 다른 글
    • (Python) 백준 2164번 - 카드 2
    • (Python) 백준 1920번 - 수 찾기
    • (Python) 백준 11866번 - 요세푸스 문제 0
    • (Python) 백준 11651번 - 좌표 정렬하기 2
    용꿀
    용꿀

    티스토리툴바