728x90
반응형
n, m = map(int, input().split())
arr = [list(map(str,input())) for _ in range(n)] # 조건 배열
n_arr = [[0 for col in range(m)] for row in range(n)]
#조건 배열 1,3 으로 치환해서 n_arr에 대입
for i in range(n):
for j in range(m):
if arr[i][j] == 'W':
n_arr[i][j] = 1
elif arr[i][j] == 'B':
n_arr[i][j] = 3
#답지 case1
zero_ans = [[3,1,3,1,3,1,3,1],
[1,3,1,3,1,3,1,3],
[3,1,3,1,3,1,3,1],
[1,3,1,3,1,3,1,3],
[3,1,3,1,3,1,3,1],
[1,3,1,3,1,3,1,3],
[3,1,3,1,3,1,3,1],
[1,3,1,3,1,3,1,3]
]
#답지 case2
one_ans = [[1,3,1,3,1,3,1,3],
[3,1,3,1,3,1,3,1],
[1,3,1,3,1,3,1,3],
[3,1,3,1,3,1,3,1],
[1,3,1,3,1,3,1,3],
[3,1,3,1,3,1,3,1],
[1,3,1,3,1,3,1,3],
[3,1,3,1,3,1,3,1]
]
#모든 경우의 수 추출
cnt = 0 #총 경우의 수 카운트
sample_matrix = []
for i in range(n-7):
for j in range(m-7):
sample_matrix.append([row[j:j+8] for row in n_arr[i:i+8]])
cnt = cnt+1
t_arr = [] #고친 횟수 저장할 리스트
#답지와 샘플의 합이 4가 되면 고쳐야 하는 부분이므로 카운트 한다. Case1
for i in range(0,cnt):
err_cnt = 0
for j in range(8):
for k in range(8):
if sample_matrix[i][j][k] + zero_ans[j][k] == 4:
err_cnt = err_cnt + 1
t_arr.append(err_cnt)
#답지와 샘플의 합이 4가 되면 고쳐야 하는 부분이므로 카운트 한다. Case2
for i in range(0,cnt):
err_cnt = 0
for j in range(8):
for k in range(8):
if sample_matrix[i][j][k] + one_ans[j][k] == 4:
err_cnt = err_cnt +1
t_arr.append(err_cnt)
z = min(t_arr) #고친 횟수 리스트에서 최솟값 추출
print(z)
우선 주어진 이차원 리스트에서 8X8로 추출하는 과정을 알아봤다.
가로 한 줄 즉 하나의 행이 1차원 리스트로 구성된 것을 반복문을 통해서 append 하는 것이었다.
내가 생각한 핵심 아이디어는 답지와 비교를 최대한 효율적으로 하는 것이었다.
입력받는 'B'와 'W' 한 글자씩 비교하는 방법도 생각해 봤다.
그러다가 그냥 숫자로 바꿔 버려서 두 리스트의 요소를 더해 버리는 방법을 생각했다.
나의 경우에는 W에 1B에 3을 할당했다. 그럼 두 리스트의 요소들을 더 했을 때 2,4,6 이렇게 3가지가 나온다.
2나 6의 경우 정상적인 1+1 혹은 3+3 이므로 답지와 같은 자리에 존재한다고 볼 수 있다.
그러나 4가 나올 경우 1+3 혹은 3+1이 된 것이므로 샘플에 답지와 다른 색이 칠해져 있다고 볼 수 있다.
따라서 4의 개수를 카운트하면 된다고 생각했다. 이때 모든 경우의 수를 전부 봐야 하므로 case1 과 case2 답지를 만들어서 모두 비교했다.
카운트한 갯수를 t_arr에 넣은 후 이중 최솟값을 찾아서 출력했다.
728x90
반응형
'Algorithm & Data Structure' 카테고리의 다른 글
백준 - 11053번 (0) | 2022.01.16 |
---|---|
백준 - 10844번 (0) | 2022.01.13 |
백준 - 15649번 (0) | 2022.01.09 |
DFS & BFS (0) | 2022.01.08 |
백준 - 2108번 (0) | 2022.01.07 |