Notice
Recent Posts
Recent Comments
Link
archive
[백준] 체스판 다시 칠하기 (Python) 본문
✏️ 문제
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
✏️ 풀이
완전탐색문제이다.
입력받은 이차원 배열을 8*8로 쪼갤 수 있는 모든 경우의 수에 대해,
각 칸의 색깔이 중복되지 않도록 하기 위해 색칠해야 할 칸의 개수를 구한다.
칸의 개수는 각각, w로 시작하는 경우 & b로 시작하는 경우로 만들기 위해 바꿔야 할 수를 구해
두 수 중 작은 것으로 선택한다.
✏️ 코드
def check_board(arr):
count_w = 0
count_b = 0
# 짝수행 wbwb 홀수행 bwbw
for i in range(8):
for j in range(8):
if i%2==0:
if j%2==0:
if arr[i][j] == 'W':
count_b += 1
else:
count_w += 1
else:
if arr[i][j] == 'B':
count_b += 1
else:
count_w += 1
else:
if j%2==0:
if arr[i][j] == 'B':
count_b +=1
else:
count_w += 1
else:
if arr[i][j] == 'W':
count_b += 1
else:
count_w += 1
return min(count_w,count_b)
# n : 세로, m : 가로
def main():
n, m = map(int, input().split())
board=[]
for _ in range(n):
line = list(input())
board.append(line)
min_cnt = n*m
for i in range(0, n-8+1):
temp = board[i:i+8]
for j in range(0, m-8+1):
arr = [row[j:j+8] for row in temp]
cnt = check_board(arr)
if cnt < min_cnt:
min_cnt = cnt
print(min_cnt)
main()
입력받은 이차원 배열을 8*8로 잘라, 칠해야 하는 칸 수를 구하도록 구현하였다.
✏️ 생각
문제 아이디어보다는 구현이 은근 까다로웠던 문제
이차원 배열의 인덱스는 늘 복잡해~~~
'STUDY > 알고리즘' 카테고리의 다른 글
[백준] 설탕 배달 (Python) (0) | 2021.03.08 |
---|---|
[백준] 숫자 야구 게임 (Python) (0) | 2021.03.08 |
[백준] 분해합 (Python) (0) | 2021.03.08 |
[백준] 블랙잭 (Python) (0) | 2021.03.08 |
[백준] 수 정렬하기 3 (Python) (0) | 2021.03.08 |
Comments