Coding Test/백준

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

Lucian_Cho 2021. 2. 28. 19:29

# 문제

 


내 풀이 - 문제 풀이 실패, 수정 답안
# 첫 칸을 검은색, 흰색 각각으로 칠할 때, 둘 중 다시 칠해야 하는 횟수가 최소인 값을 리턴하는 함수 정의
def paint_board(chess_board):
    # 첫 칸이 검은색일 경우와 흰색일 경우, 각각 다시 칠하는 횟수
    start_b, start_w = 0, 0
    for i in range(8):
        for j in range(8):
            if (i + j) % 2 == 0:
                if chess_board[i][j] != 'B':
                    start_b += 1
                if chess_board[i][j] != 'W':
                    start_w += 1
            else:
                if chess_board[i][j] != 'W':
                    start_b += 1
                if chess_board[i][j] != 'B':
                    start_w += 1
    min_val = min(start_b, start_w)

    return min_val


n, m = map(int, input().split())
board = [list(input()) for _ in range(n)]  # MN 보드 입력 받기
result = int(10e9)  # 다시 칠하는 최소 횟수

# 각각의 체스판 중 가장 최소인 값 탐색
for i in range(n - 7):
    for j in range(m - 7):
        # 8 X 8 체스판 크기로 보드를 slicing
        chess_board = [row[j:j+8] for row in board[i:i+8]]
        min_paint_cnt = paint_board(chess_board)
        # 현재 체스판의 값이 최소면, 최소값 갱신
        result = min(result, min_paint_cnt)

# 결과 출력
print(result)

 

생각해볼 점
두 가지 포인트를 알고 가는 것이 좋을 것 같다. 하나는 체스판의 칸을 선택할 때 (i + j) % 2를 기준으로 나누면 멋지게 풀린다는 점이다. 두 번째는 이차원 리스트를 슬라이싱하는 방식인데, [row[j:j+m] for row in field[i:i+n]] 코드를 암기해두면 매우 편리할 것 같다. 이에 대해서 아래 블로그를 참고했으니, 링크를 남긴다.

 

※ 이차원 리스트의 슬라이싱 방법

https://programming119.tistory.com/169

 

[Python] 파이썬 2차원 리스트 Slicing / 일부분 선택, 추출하기 ✨

파이썬에서 1차원 리스트을 슬라이싱하는건 간단합니다. arr = "ABCDE" arr[0:3] = "ABC" 하지만 리스트가 2차원 이라면? 꽤나 골치아파지죠. numpy를 이용하면 되지만, numpy가 익숙하지 않은 저로서는 그

programming119.tistory.com