-
[백준 1018번] 체스판 다시 칠하기Coding Test/백준 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]] 코드를 암기해두면 매우 편리할 것 같다. 이에 대해서 아래 블로그를 참고했으니, 링크를 남긴다.
※ 이차원 리스트의 슬라이싱 방법
'Coding Test > 백준' 카테고리의 다른 글
[백준 4948번] 베르트랑 공준 (0) 2021.03.06 [백준 1929번] 소수 구하기 (0) 2021.03.04 [백준 2887번] 행성 터널 (0) 2021.02.26 [백준 1978번] 소수 찾기 (0) 2021.02.25 [백준 1259번] 팰린드롬수 (0) 2021.02.24