본문 바로가기
코딩테스트 준비/백준

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

by rahites 2022. 1. 10.

 

# 사실 이 문제는 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일 전에는 몇번 틀렸다 ) 기분이 좋다.

 

 

 

오늘도 성공적으로 체스판을 색칠하였다.

댓글