# 사실 이 문제는 20일정도 전에 먼저 시도해보았던 문제이다. 하지만 그 때는 접근 방법을 정확히 파악하지 못해서 ( 너무 어렵게 생각했던것 같다 ) 예외가 많은 코드를 짜서 제출했던것 같다.
이 문제를 풀 때 처음 생각했던 것은, 주어진 보드는 무조건 8x8보다 크기 때문에 8x8 사이즈의 직사각형을 움직여가며 바꿔야 하는 횟수를 count, 가장 적은 횟수를 출력하면 되겠구나..! 하는 아이디어였다. 물론 코드 또한 그렇게 만들었다.
-- 내가 짠 코드
import sys
N, M = map(int, sys.stdin.readline().split()) # N * M 크기의 보드
board = []
for _ in range(N):
# sys.stdin.readline()은 개행문자를 받기때문에 strip을써야 개행문자를 빼고 받아준다
board.append(list(sys.stdin.readline().strip())) # 열마다 하나의 리스트로 전체에 추가
answer_list = []
# BWBW로 바꾸는게 적은지, WBWB로 바꾸는게 적은지 둘다 판단
# 8x8크기의 직사각형을 움직인다고 생각!
for start_row in range(N-7): # 행 수 반복
for start_col in range(M-7): # 열 수 반복
BWBW = 0 # BWBW일경우 바꿔줘야될 횟수 count
WBWB = 0 # WBWB일경우 바꿔줘야될 횟수 count
for i in range(start_row, start_row + 8):
for j in range(start_col, start_col + 8):
if (i + j) % 2 == 0: # BWBW라면 B위치,WBWB라면 W 위치
if board[i][j]=="B":
WBWB += 1
else:
BWBW += 1
else:
if board[i][j]=="B":
BWBW += 1
else:
WBWB += 1
# 8x8 직사각형을 모두 판단 -> 각각의 값을 정답리스트에 추가
answer_list.append(BWBW)
answer_list.append(WBWB)
print(min(answer_list)) # 최소값을 프린트해주면 완성!!
< 우선 이번에 추가적으로 알게 된 사실이 있는데 sys.stdin.readline()은 입력을 받아줄 때 마지막에 개행문자인 /n을 받아준다는 것이였다. 따라서 strip을 사용하지 않고 그대로 리스트 함수를 사용하게 되면 마지막에 붙어있는 /n까지 문자로 받아 리스트에 저장된다. >
-- 기본적인 코드에 대한 설명은 다음과 같다.
1. 우선 N, M을 숫자로 받아주고, 입력받는 보드의 형태를 이중 리스트로 받아주었다. ( 이런과정은 Java에 더 잘 어울리는..? )
2. 4중 for문을 사용해 주었는데 4중이라는 말이 복잡해 보일 뿐이지 사실 8x8 사이즈의 직사각형을 주어진 보드의 크기에 맞게 한번 count를 끝내고 움직이는 형태라고 생각하면 편하다.
3. 한 사이즈의 직사각형의 크기를 특정한 후 글자 하나하나씩을 비교해주며 정답이 BWBW일때 바꿔줘야 하는 값이 있다면 BWBW변수에 +1, 정답이 WBWB일때 바꿔줘야 하는 값이 있다면 WBWB변수에 +1을 해주었다.
4. 하나의 직사각형에 대한 count가 끝나고 answer_list에 해당값 2개를 모두 append해주어 마지막에 min을 통해 최솟값을 뽑아내었다.
생각보다 깔끔하게 코드가 짜여졌고 결과도 한번에 정답이 나와 ( 물론 20일 전에는 몇번 틀렸다 ) 기분이 좋다.
오늘도 성공적으로 체스판을 색칠하였다.
'코딩테스트 준비 > 백준' 카테고리의 다른 글
[백준 1620번] 나는야 포켓몬 마스터 이다솜 (0) | 2022.01.13 |
---|---|
[백준 2805번] 나무 자르기 - 이분탐색 예제 (0) | 2022.01.08 |
[백준 2869번] 달팽이는 올라가고 싶다 (0) | 2022.01.06 |
댓글