본문 바로가기
Computer Science/Algorithm

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

by 9루트 2023. 1. 7.

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

행렬 헷갈리지말기

 

2차원 배열 행렬 읿력하기

# 행렬 입력
n, m = map(int, input().split())
# 2차원 배열 입력
board = [list(map(str, input().split()))for _ in range(m)]

 

아래 순서로 문제를 풀었다.

# 보드에서 8x8 판 부분 정하기 (n-8)x(m-8)
# 정한 부분에서 검정 시작, 흰색 시작 두 가지 경우로 나누기 x2
# 8x8 모두 스캔해서 고쳐할 부분 찾기 x(8x8)

 

그리고 참고한 블로그

2차원 배열 슬라이싱은 어떻게 하는 가?

https://programming119.tistory.com/169

 

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

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

programming119.tistory.com

보드에서 8x8 판 부분 정하기 (n-8)x(m-8)
2차원 배열 슬라이싱
'''
n(행) x m(열) 행렬을 빼낼 때
i = row(행)의 인덱스
j = column(열)의 인덱스
[row[j : j + m] for row in field[i : i + n]
'''

print("len(board): ", len(board), len(board[0]))
for i in range(len(board) - n):
    for j in range(len(board[i]) - m):
        print("추출")
        # 8x8 리스트 추출
        mylist = [row[j : j + m] for row in board[i : i + n]]
        for line in mylist:
            print(line)

 

 

내가 푼 풀이( 정답 )

# BOJ_1018
# 보드에서 8x8 판 부분 정하기 (n-8)x(m-8)
# 정한 부분에서 검정 시작, 흰색 시작 두 가지 경우로 나누기 x2
# 8x8 모두 스캔해서 고쳐할 부분 찾기 x(8x8)

# 행렬 입력
n, m = map(int, input().split())
# 2차원 배열 입력
# board = [list(map(str, input().split()))for _ in range(n)]
board = [['0' for j in range(m)] for i in  range(n)]
for i in range(n):
    line = list(input())
    for j in range(m):
        board[i][j] = line[j]

change = 0
min = 64 # 8x8
# # 보드에서 8x8 판 부분 정하기 (n-8)x(m-8)
# print("len(board): ", len(board), len(board[0]))
for r in range(len(board) - 8 + 1):
    for c in range(len(board[r]) - 8 + 1):
        # 8x8 리스트 추출
        myBoard = [row[c : c + 8] for row in board[r : r + 8]]
        # print(myBoard)

        # 정한 부분에서 검정 시작, 흰색 시작 두 가지 경우로 나누기 x2
        for color in range(2):
            change = 0
            for i in range(8):
                for j in range(8):
                    if color == 0: # 흰색으로 시작
                        # (짝수, 홀수) 조합이면 블랙이어야 함
                        if (i % 2 == 0 and j % 2 == 1) or (i % 2 == 1 and j % 2 == 0):
                            # 8x8 모두 스캔해서 고쳐할 부분 찾기 x(8x8)
                            if myBoard[i][j] == 'W':
                                change += 1
                        else: # (짝, 짝) 이거나 (홀, 홀) 조합이면 화이트이어야 함
                            if myBoard[i][j] == 'B':
                                change += 1
                    else: # 검정으로 시작
                        # (짝수, 홀수) 조합이면 화이트이어야 함
                        if (i % 2 == 0 and j % 2 == 1) or (i % 2 == 1 and j % 2 == 0):
                            # 8x8 모두 스캔해서 고쳐할 부분 찾기 x(8x8)
                            if myBoard[i][j] == 'B':
                                change += 1
                        else:  # (짝, 짝) 이거나 (홀, 홀) 조합이면 블랙이어야 함
                            if myBoard[i][j] == 'W':
                                change += 1
            # print(change)
            if change < min:
                min = change

print(min)