본문 바로가기

Algorithm & Data Structure

백준 - 1018번

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