문제 링크
정답 코드는 아래와 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
N = 8
str1 = "WBWBWBWB"
str2 = "BWBWBWBW"
pivot1 = [ str1, str2, str1, str2, str1, str2, str1, str2 ]
pivot2 = [ str2, str1, str2, str1, str2, str1, str2, str1 ]
def solve():
a, b = [int(x) for x in input().split()]
arr = []
for i in range(a):
arr.append(input())
rst = float('inf')
for i in range(a-N+1):
for j in range(b-N+1):
count = 0
for p in range(N):
for q in range(N):
if arr[i+p][j+q] != pivot1[p][q]:
count += 1
rst = min(rst, count)
count = 0
for p in range(N):
for q in range(N):
if arr[i+p][j+q] != pivot2[p][q]:
count += 1
rst = min(rst, count)
print(rst)
solve()
|
cs |
이 문제에 대한 저의 풀이는 단순하게 모든 경우에 대해서 모든 값을 다 비교해보고 그 중에서 가장 작은 값을 출력하는 것입니다.
기준(pivot)이 되는 체스판은 2개가 있습니다.
하나는 흰 칸부터 시작하는 것(pivot1)이고, 다른 하나는 검은 칸부터 시작하는 것(pivot2) 입니다.
각 라인이 중복적으로 발생하기 때문에 위 코드와 같이 라인을 2개 먼저 만들어 놓고 그걸 연달아서 이어 붙여서 pivot1 과 pivot 2를 아래와 같이 만듭니다.
<pivot1>
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
<pivot2>
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
그 다음에는 입력으로 주어진 체스판의 (0,0) 위치부터 (a-8+1, b-8+1) 위치까지 모든 경우에 대해서 다시 칠해야 하는 칸의 갯수를 구합니다.
(a-8+1, b-8+1) 까지만 하는 이유는 이 위치를 넘어가면 주어진 판 위에 8X8 의 체스판을 덮었을 때, 뒷 부분은 겹치지 않기 때문입니다.
이제 각 경우들에 대해서 다시 칠해야 하는 칸의 갯수를 구합니다.
pivot1 에 대해서도 구하고 pivot2 에 대해서도 구합니다.
문제의 정답은 모든 값 중에서 가장 작은 값이기 때문에 가장 작은 값만을 유지해주었다가 마지막에 출력해줍니다.
풀이는 아래 영상 참고 바랍니다.
www.youtube.com/watch?v=98TMUoYCCEE
저작권 라이선스: CC BY (출처만 표시하면 자유롭게 이용 가능)
'백준(BOJ) 문제 풀이' 카테고리의 다른 글
백준 1152번 문제(단어의 개수) 파이썬(Python) 풀이 [로밍맨] (0) | 2021.07.02 |
---|---|
백준 1149번 문제(RGB거리) 파이썬(Python) 풀이 [로밍맨] (0) | 2021.07.02 |
백준 1010번 문제(다리 놓기) 파이썬(Python) 풀이 [로밍맨] (2) | 2021.07.02 |
백준 1008번 문제(A/B) 파이썬(Python) 풀이 [로밍맨] (0) | 2021.07.02 |
백준 1001번 문제(A-B) 파이썬(Python) 풀이 [로밍맨] (0) | 2021.07.02 |