[Python]BaekJoon.AC

[Python]백준 BaekJoon.AC 1018 : 체스판 다시 칠하기(list, for문)

스뇨잉 2022. 1. 10. 17:53
728x90
728x90

 

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 

 

string 문자열을 그냥.. st = "abcd"로 선언하고 st[1]을 프린트하면 b가 출력되더라...?

2차원 배열을 리스트로 어떻게 구현해야 할까 고민했는데 그냥 리스트에 문자열을 통채로 넣으면 되는 거였다.

그 자체가 2차원 리스트라 말할 수 있다. 대신 특정 방법을 사용하지 않는 한 수정은 안되는 듯 하다.

너무 신기하고 기특한 파이썬...!ㅋㅋ

 

 

더 간추리는 방법이 있지만 가독성과 이해하기 쉬운 코드로 만들고 싶었다.

애초에 코드가 길어 그럴 수 있을지 모르겠지만..

리스트에 저장한 보드판, for문 두개로 8x8 체스판의 왼쪽위 꼭짓점을 정해준다.

모든 체스판은 왼위 꼭짓점이 B로 시작하며, 색칠이 필요한 개수를 8x8인 64에서 빼준 값이, 왼위 꼭짓점이 W로 시작할 때 색칠이 필요한 개수이다. 그러니 한쪽만 계산해주면 두 경우를 모두 비교할 수 있다.

 

밑으로 두칸씩, 오른쪽으로 두칸씩 이동하며 B인지, W인지 확인하는 방식이다. 1-2와 2-2의 시작점은 1이 더해져있다.

예를 들어 1-1이 홀수칸이 B인지 확인한다면, 1-2는 짝수칸이 W인지 확인한다.

 

for문이 많아 복잡해보이지만 이해한다면 그리 어렵지 않은.. 그래도 복잡한건 사실이다ㅋㅋ

이제 실버 등급인만큼 까다로운 문제가 시작된 것 같다..!

 

 

 

N, M = map(int, input().split())
board = []
result = 3000

for i in range(N):
    board.append(input())
    
#왼꼭 기준 B로 설정하고, 다시 칠해야 하는 수 32개 넘으면 64에서 빼준다.
#8x8크기 설정하고 꼭짓점 정하는 for문 2개
for n in range(0, N-7): #세로, [n][m]이 체스판의 왼쪽 꼭짓점
    for m in range(0, M-7): #M-8은 되야 우측으로 8칸 만족하니, range식으로는 M-7
        count = 0
		
	#1-1
        for i in range(n, n+8, 2): #한줄씩 밑으로 건너뜀, 첫칸은 B
	    #2-1
            for j in range(m, m+8, 2): #한칸씩 옆으로 건너뛰며 B인지 확인
                if board[i][j]!="B":
                    count = count + 1
	    #2-2
            for j in range(m+1, m+8, 2): #한칸씩 옆으로 건너뛰며 W인지 확인
                if board[i][j]!="W":
                    count = count + 1

	#1-2
        for i in range(n+1, n+8, 2): #한줄씩 밑으로 건너뜀, 첫칸은 W
	    #2-1
            for j in range(m, m+8, 2): #한칸씩 옆으로 건너뛰며 W인지 확인
                if board[i][j]!="W":
                    count = count + 1
	    #2-2
            for j in range(m+1, m+8, 2): #한칸씩 옆으로 건너뛰며 B인지 확인
                if board[i][j]!="B":
                    count = count + 1

        count = min(count, 64-count)
        result = min(count, result)

print(result)

 

 

728x90
728x90