본문 바로가기
알고리즘/Solved_Silver

[Python Silver IV 1018] 체스판 다시 칠하기

by Hexs 2023. 3. 22.
반응형

https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

첫 번째 입력으로 보드 크기를 입력받습니다.

두 번째 입력으로 체스판의 색상을 입력받습니다.

체스판은 이런 식으로 검은색 ( B ) 와 흰색 ( W ) 가 번갈아 가며 체크무늬로 이루어진 8*8 크기입니다.

이 두 가지 케이스를 가지고 

입력받은 체스판을 검사하고 가장 적은 색상을 바꾸는 경우를 출력하면 됩니다.

 

[ 1 ~ 8 ] 체스판이 될 수 있는 2가지 경우를 정의해줍니다.

[ 9 ] 보드 크기를 입력받습니다.

[ 10 ~ 12 ] T_ 리스트에 보드 색상 정보를 입력받습니다.

[ 14 ~ 15 ] x 축과 y축으로 한 칸씩 이동하며 검사할 거기 때문에 기존 체스판 크기인 8 * 8 에서 초과하는 크기를 입력해줍니다.



[ 18 ] search 함수를 만들고 x, y 인자를 받습니다.

[ 20 ~ 26 ]  for 문을 사용하여 0, 0지점부터 8 * 8 크기를 검사해줍니다. 원점은 인자로 받은 x, y 값으로 증가 시켜주게 되고 0, 0 이 검은색 일 때와 흰색일 때 두 가지를 동시에 검사해줍니다.

for문을 다 돌고 난 뒤 검은색과 흰색 중 작은 값을 Result_lst 에 추가해줍니다.



[ 28 ~ 34 ] 처음에 정했던 초과분의 x 와 y 값을 for문을 사용해서 search 함수에 인자로 넣어줍니다.

계산량을 줄이기 위해서 만약에 Result_lst에 0이 있다면 검색을 종료합니다.

 

[ 36 ] Result_lst 에서 가장 작은값을 출력합니다.

 

 

 

B_ = [("B","W","B","W","B","W","B","W"),("W","B","W","B","W","B","W","B"),
     ("B","W","B","W","B","W","B","W"),("W","B","W","B","W","B","W","B"),
     ("B","W","B","W","B","W","B","W"),("W","B","W","B","W","B","W","B"),
     ("B","W","B","W","B","W","B","W"),("W","B","W","B","W","B","W","B"),]
W_ = [("W","B","W","B","W","B","W","B"),("B","W","B","W","B","W","B","W"),
     ("W","B","W","B","W","B","W","B"),("B","W","B","W","B","W","B","W"),
     ("W","B","W","B","W","B","W","B"),("B","W","B","W","B","W","B","W"),
     ("W","B","W","B","W","B","W","B"),("B","W","B","W","B","W","B","W")]
n, m = map(int, input().split())
T_ =[]
for i in range(n):
    T_.append(input())
    
x_max = len(T_[0])-8
y_max = len(T_)-8
Result_lst = []

def search(x,y):
    B_Count, W_Count = 0,0
    for k in range(8):
        for j in range(8):
            if T_[k+x][j+y] != B_[k][j]:
                B_Count +=1
            elif T_[k+x][j+y] != W_[k][j]:
                W_Count +=1
    Result_lst.append(min(B_Count,W_Count))

for i in range(x_max+1):
    for j in range(y_max+1):
        search(j,i)
        if Result_lst.count(0) > 0:
            break
    if Result_lst.count(0) > 0:
            break

print(min(Result_lst))
반응형

'알고리즘 > Solved_Silver' 카테고리의 다른 글

[Python Silver V 11650] 좌표 정렬하기  (0) 2023.03.22
[Python Silver V 1181] 단어 정렬  (0) 2023.03.22
[Python Silver IV 2839]  (0) 2023.03.16
[Python Silver IV 9012]  (0) 2023.03.16
[Python Silver V 1193]  (0) 2023.03.09