728x90
https://www.acmicpc.net/problem/1018
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
- 코드1
# N*N 크기의 보드
N,M = map(int,input().split())
jimin = [input() for _ in range(N)]
min_cnt = 10**10
# (r,c)는 시작 위치
for r in range(N-8+1):
for c in range(M-8+1):
# w시작인지, b시작인지 동시에 비교? -> 반대로 뒤집힐 때도 있으니 단정X
one = 0
two = 0
# (i,j)는 비교 위치
for i in range(r,r+8):
for j in range(c,c+8):
# 번갈아 가면서 wbwb비교? bwbw비교?
if (i+j)%2:
if jimin[i][j] == 'B':
one += 1
else:
two += 1
else:
if jimin[i][j] == 'W':
one += 1
else:
two += 1
# 비교 다 한 후 최솟값인가?
min_cnt = min(min_cnt,one,two)
print(min_cnt)
- 코드1이 너무 지저분해보여서 좀 더 깔끔하게 짜고 싶었으나...
- 코드2
# M*N 크기의 보드
N,M = map(int,input().split())
jimin = [input() for _ in range(N)]
min_cnt = 10**10
# (r,c)는 시작 위치
for r in range(N-8+1):
for c in range(M-8+1):
# b로 시작, w로 시작
one = 0
two = 0
# (i,j)는 비교 위치
for i in range(r,r+8):
# num1 + num2 : WBWBWBWB와 일치하는 갯수
num1 = [jimin[i][c+0], jimin[i][c+2], jimin[i][c+4], jimin[i][c+6]].count('B')
num2 = [jimin[i][c+1], jimin[i][c+3], jimin[i][c+5], jimin[i][c+7]].count('W')
if i%2:
one += 8-num1-num2
two += num1+num2
else:
two += 8 - num1 - num2
one += num1 + num2
# 비교 다 한 후 최솟값인가?
min_cnt = min(min_cnt,one,two)
print(min_cnt)
728x90
반응형
'TIL - 프로그래밍 > Python 알고리즘' 카테고리의 다른 글
[프로그래머스] Lv.1 예산 - Python (0) | 2022.06.09 |
---|---|
[프로그래머스] Lv.1 소수 만들기 - Python (0) | 2022.06.09 |
[백준] 1182. 부분수열의 합 - Python (0) | 2022.06.06 |
[백준] 1987. 알파벳 - Python (0) | 2022.06.06 |
[프로그래머스] Lv.2 오픈채팅방 - Python (0) | 2022.06.05 |
댓글