본문 바로가기
백준

[백준] 1018번 : 체스판 다시 칠하기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 7. 26.
728x90
반응형

 

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

 

1. 문제 설명

2. 풀이과정

해당 문제는 조금 귀찮긴 하지만 처음부터 끝까지 가능한 8x8 체스판을 선정하고 선정한 체스판마다 각 왼쪽 상단의 시작 칸이 흰색과 검은색으로 시작하도록 색칠한다.

각 색별 칠한 칸 수를 따로 구하여 더 적은 칸을 칠한 경우를 계속 적으로 저장한다.

 

  1. sys.stdin.readline() 함수를 사용하기 위해 sys 모듈을 불러온다. import sys
  2. 보드의 크기를 각 입력받는다. N, M = map(int, sys.stdin.readline().split())
  3. 보드의 각 칸의 색을 저장할 리스트를 생성한다. li = list()
  4. 보드의 행 길이만큼 반복하며 for i in range(N)
  5. 색의 정보를 입력받고 하나씩 분리하여 리스트로 추가한다. li.append(list(sys.stdin.readline().rstrip()))
  6. 가능한 8x8 체스판을 모두 구하기 위해 체스판의 시작 칸의 행과 열 위치의 를 나타내줄 변수를 생성하고 초기화한다. row = 0  col = 0
  7. 최소로 칠하는 칸의 수를 저장할 변수를 생성하고 최대로 칠하는 횟수로 초기화한다. Min = 64
  8. 체스판의 세로길이가 보드 안에 있으면 반복한다. while (row + 8 <= N)
  9. 먼저 제일 앞 칸이 흰색일 때의 경우 칠하는 칸의 수를 저장할 변수를 생성하고 초기화한다. count1 = 0
  10. 8개의 행을 살펴보고 for i in range(row, row + 8)
  11. 각 행의 정보를 추출하여 저장한다. result = li[i][col : col + 8]
  12. 만약 행이 제일 윗 행이 아닐 때 if (i != row)
  13. 만약 추출한 정보의 첫 번째 칸이 이전 행의 첫 번째 칸과 같으면 if (result[0] == start)
  14. 색을 서로 다르게 바꿔 칠해야 한다. result[0] = 'B' if start == 'W' else 'W'
  15. 색을 바꿔 칠했으므로 칠한 칸의 개수를 1 증가시킨다. count1 += 1
  16. 반면 행이 제일 윗 행일 때 else
  17. 제일 앞칸이 흰색이 되도록 칠한다. if (result[0] != 'W'): result[0] = 'W'
  18. 색을 칠했다면 칠한 칸의 개수를 1 증가시킨다. count1 += 1
  19. 두 번째 칸부터 마지막 칸까지 추출하며 for j in range(1, 8)
  20. 만약 추출한 칸이 이전 칸의 색과 같을 경우 if (result[j - 1] == result[j])
  21. 색을 서로 다르게 바꿔 칠한다. result[j] = 'B' if result[j - 1]  == 'W' else 'W'
  22. 색을 바꿔 칠했으므로 칠한 칸의 개수를 1 증가시킨다. count1 += 1
  23. 제일 앞 칸의 색을 다음 행을 위해 따로 저장한다. start = result[0]

 

  1. 똑같은 방법으로 제일 앞 칸이 검은색일 때의 경우 칠하는 칸의 수를 저장할 변수를 생성하고 초기화한다. count2 = 0
  2. 8개의 행을 살펴보고 for i in range(row, row + 8)
  3. 각 행의 정보를 추출하여 저장한다. result = li[i][col : col + 8]
  4. 만약 행이 제일 윗 행이 아닐 때 if (i != row)
  5. 만약 추출한 정보의 첫 번째 칸이 이전 행의 첫 번째 칸과 같으면 if (result[0] == start)
  6. 색을 서로 다르게 바꿔 칠해야 한다. result[0] = 'B' if start == 'W' else 'W'
  7. 색을 바꿔 칠했으므로 칠한 칸의 개수를 1 증가시킨다. count2 += 1
  8. 반면 행이 제일 윗 행일 때 else
  9. 제일 앞칸이 검은색이 되도록 칠한다. if (result[0] != 'B'): result[0] = 'B'
  10. 색을 칠했다면 칠한 칸의 개수를 1 증가시킨다. count2 += 1
  11. 두 번째 칸부터 마지막 칸까지 추출하며 for j in range(1, 8)
  12. 만약 추출한 칸이 이전 칸의 색과 같을 경우 if (result[j - 1] == result[j])
  13. 색을 서로 다르게 바꿔 칠한다. result[j] = 'B' if result[j - 1]  == 'W' else 'W'
  14. 색을 바꿔 칠했으므로 칠한 칸의 개수를 1 증가시킨다. count2 += 1
  15. 제일 앞 칸의 색을 다음 행을 위해 따로 저장한다. start = result[0]
  16. 만약 두 결과 중 최솟값이 이전에 구했던 최솟값보다 더 작으면 if (Min > (count1 if count1 <= count2 else count2))
  17. 최솟값을 새로 저장한다. Min = (count1 if (count1 <= count2 else count2)
  18. 체스판을 새로 지정하기 위해 시작하는 열의 위치를 옮긴다. col += 1
  19. 만약 옮긴 열에서부터 새로 지정할 체스판이 보드를 넘어가면 if (col + 8 > M)
  20. 제일 앞 열로 옮기고 col = 0
  21. 행을 다음 행으로 내려준다. row += 1
  22. 최종적으로 가장 적게 칠하는 경우의 수를 출력한다. print(Min)
반응형

3. 소스코드

import sys

N, M = map(int, sys.stdin.readline().split())

li = list()
for i in range(N):
    li.append(list(sys.stdin.readline().rstrip()))

row = 0
col = 0
Min = 64
while (row + 8 <= N):
    count1 = 0
    for i in range(row, row + 8):
        result = li[i][col : col + 8]
        if (i != row):
            if (result[0] == start):
                result[0] = 'B' if start == 'W' else 'W'
                count1 += 1
        else:
            if (result[0] != 'W'):
                result[0] = 'W'
                start = result[0]
                count1 += 1

        for j in range(1, 8):
            if (result[j - 1] == result[j]):
                result[j] = 'B' if result[j - 1] == 'W' else 'W'
                count1 += 1

        start = result[0]

    count2 = 0
    for i in range(row, row + 8): 
        result = li[i][col : col + 8]
        if (i != row):
            if (result[0] == start):
                result[0] = 'B' if start == 'W' else 'W'
                count2 += 1
        else:
            if (result[0] != 'B'):
                result[0] = 'B'
                start = result[0]
                count2 += 1

        for j in range(1, 8):
            if (result[j - 1] == result[j]):
                result[j] = 'B' if result[j - 1] == 'W' else 'W'
                count2 += 1

        start = result[0]

    if (Min > (count1 if count1 <= count2 else count2)):
        Min = (count1 if count1 <= count2 else count2)

    col += 1
    if (col + 8 > M):
        col = 0
        row += 1

print(Min)
728x90
반응형