파이썬 알고리즘 문제풀이/완전탐색
BOJ 1028 체스판칠하기.
monsangter
2023. 4. 8. 06:00
실버4밖에 되지 않는데 매우 어려웠기 때문에 풀이를 참조하여 해결하였다.. 생소한 유형이라 그런듯.
from sys import stdin
def main():
def input():
return stdin.readline().rstrip()
N,M = map(int,input().split())
matrix = [input() for i in range(N)]
w_board = [
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
]
b_board = [
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
]
def check(i,j):
result_w = 0
result_b = 0
for di in range(8):
for dj in range(8):
ni,nj = i+di,j+dj
if matrix[ni][nj] != w_board[di][dj]:
result_w += 1
if matrix[ni][nj] != b_board[di][dj]:
result_b += 1
return min(result_w, result_b)
result = 1000000
for i in range(N-7):
for j in range(M-7):
result = min(result,check(i,j))
print(result)
if __name__ == "__main__":
main()
문제의 조건. m,n크기의 보드가 주어지고 이를 88크기의 체스판으로 만든다.
일단 인풋으로 N,M값을 받는다.그리고 N만큼의 반복을 통해 입력으로 주어지는 chess판을 matrix로 받는다.
이후 모범케이스가 되는 W보드와 B보드를 하드코딩.
check함수를 선언해
탐색할만큼의 범위를 가진 이중 포문을 만든다. 이 탐색은 첫 시작점이 계속 달라져야하기떄문에 따로 ni,nj변수를 만들어준다.
이후 현재 탐색하고있는 위치인 ni,nj가 이상적 와이트 블랙보드와 다르다면 다른 횟수를 1씩 카운트 해준다.
결과 w, 결과 b중에 최소값 반환하면 검사함수 선언 완료.
이후 시작 점을 계속 바꿔 check함수에 인자로 전달해주기 위해 n-7, m-7 범위의 이중포문을 만들어준다. 시작점마다 다른 값이 나오기 떄문에
result = min(result,check(i,j)) 체크함수 실행값과 현제 레쥴트 값중 최소을 계속 갱신. 이후 result값 print