728x90
반응형
1. 문제 설명
2. 풀이과정
해당 문제는 조금 귀찮긴 하지만 처음부터 끝까지 가능한 8x8 체스판을 선정하고 선정한 체스판마다 각 왼쪽 상단의 시작 칸이 흰색과 검은색으로 시작하도록 색칠한다.
각 색별 칠한 칸 수를 따로 구하여 더 적은 칸을 칠한 경우를 계속 적으로 저장한다.
- sys.stdin.readline() 함수를 사용하기 위해 sys 모듈을 불러온다. import sys
- 보드의 크기를 각 입력받는다. N, M = map(int, sys.stdin.readline().split())
- 보드의 각 칸의 색을 저장할 리스트를 생성한다. li = list()
- 보드의 행 길이만큼 반복하며 for i in range(N)
- 색의 정보를 입력받고 하나씩 분리하여 리스트로 추가한다. li.append(list(sys.stdin.readline().rstrip()))
- 가능한 8x8 체스판을 모두 구하기 위해 체스판의 시작 칸의 행과 열 위치의 를 나타내줄 변수를 생성하고 초기화한다. row = 0 col = 0
- 최소로 칠하는 칸의 수를 저장할 변수를 생성하고 최대로 칠하는 횟수로 초기화한다. Min = 64
- 체스판의 세로길이가 보드 안에 있으면 반복한다. while (row + 8 <= N)
- 먼저 제일 앞 칸이 흰색일 때의 경우 칠하는 칸의 수를 저장할 변수를 생성하고 초기화한다. count1 = 0
- 8개의 행을 살펴보고 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'
- 색을 바꿔 칠했으므로 칠한 칸의 개수를 1 증가시킨다. count1 += 1
- 반면 행이 제일 윗 행일 때 else
- 제일 앞칸이 흰색이 되도록 칠한다. if (result[0] != 'W'): result[0] = 'W'
- 색을 칠했다면 칠한 칸의 개수를 1 증가시킨다. count1 += 1
- 두 번째 칸부터 마지막 칸까지 추출하며 for j in range(1, 8)
- 만약 추출한 칸이 이전 칸의 색과 같을 경우 if (result[j - 1] == result[j])
- 색을 서로 다르게 바꿔 칠한다. result[j] = 'B' if result[j - 1] == 'W' else 'W'
- 색을 바꿔 칠했으므로 칠한 칸의 개수를 1 증가시킨다. count1 += 1
- 제일 앞 칸의 색을 다음 행을 위해 따로 저장한다. start = result[0]
- 똑같은 방법으로 제일 앞 칸이 검은색일 때의 경우 칠하는 칸의 수를 저장할 변수를 생성하고 초기화한다. count2 = 0
- 8개의 행을 살펴보고 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'
- 색을 바꿔 칠했으므로 칠한 칸의 개수를 1 증가시킨다. count2 += 1
- 반면 행이 제일 윗 행일 때 else
- 제일 앞칸이 검은색이 되도록 칠한다. if (result[0] != 'B'): result[0] = 'B'
- 색을 칠했다면 칠한 칸의 개수를 1 증가시킨다. count2 += 1
- 두 번째 칸부터 마지막 칸까지 추출하며 for j in range(1, 8)
- 만약 추출한 칸이 이전 칸의 색과 같을 경우 if (result[j - 1] == result[j])
- 색을 서로 다르게 바꿔 칠한다. result[j] = 'B' if result[j - 1] == 'W' else 'W'
- 색을 바꿔 칠했으므로 칠한 칸의 개수를 1 증가시킨다. 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)
반응형
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
반응형
'백준' 카테고리의 다른 글
[백준] 2164번 : 카드2 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.29 |
---|---|
[백준] 1697번 : 숨바꼭질 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.28 |
[백준] 10845번 : 큐 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.27 |
[백준] 11653번 : 소인수분해 - 파이썬(Python) - 우당탕탕 개발자되기 프로젝트 (0) | 2023.07.27 |
[백준] 1931번 : 회의실 배정 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.26 |
[백준] 2579번 : 계단 오르기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.25 |
[백준] 10814번 : 나이순 정렬 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.24 |
[백준] 1149번 : RGB거리 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.07.23 |