백준 1018 파이썬, 초심자에게 설명

우주·2023년 9월 19일
0

코딩테스트

목록 보기
2/3
post-thumbnail

아니 이걸 어떻게 생각하지?

문법을 보며 실버5 문제부터 훑고 있는 내게 생각보다 난관이었던 문제였다.

문제정의를 어떻게 해야했고

여기서 생각이 어떻게 뻗어나가야할 지 몰랐다.

🤔 1018 입력 조건 전문

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

예제로 보여지는 입력과 출력은 어떤 알고리즘일까 고민했다

  1. 먼저 입력을 받는다
a,b = map(int, input().split(" "))
  • 두 개의 정수를 입력받고 이를 공백으로 나눠야 하기 때문에 위와 같이 입력을 받는다. 아마 이것은 다 알겠지
  1. 체스판을 2차원 배열로 만들어야 한다.
chess_table = []
cnt = []
for i in range(a):
    chess_table.append(input())
  • 예제 입력과 같이 한줄에 a * b 만큼 입력해야한다.
  • 여기서 a만큼 for문을 반복하는 이유는 a가 행의 갯수(가로의 갯수)만큼 반복하기 때문이다.
  1. 4중 for 문을 통해 계산을 시작한다.
for i in range(a-7): #첫 번째 for문
    for j in range(b-7):
        w_start = 0
        b_start = 0
        for k in range(i, i+8):
            for l in range(j, j+8):
                if (k+l) % 2 ==0:
                  if chess_table[k][l] != 'W':
                      w_start = w_start+ 1
                  if chess_table[k][l] != 'B':
                      b_start = b_start+ 1
                else :
                  if chess_table[k][l] != 'B':
                      w_start =w_start + 1
                  if chess_table[k][l] != 'W':
                      b_start = b_start +1
        cnt.append(w_start)
        cnt.append(b_start)
print(min(cnt))
for i in range(a-7):
    for j in range(b-7):
        w_start = 0
        b_start = 0
  • 첫 번째 for문의 경우 a-7을 하는 이유가 있다면
    만약 a가 15인 경우에 -7을 한 부분부터 시작해야지 8*8의 체스판을 만들 수 있기 때문이다
  • (b-7)만큼 돌리는 이유도 위와 동일하다
for k in range(i, i+8):
            for l in range(j, j+8):
                if (k+l) % 2 ==0:
                  if chess_table[k][l] != 'W':
                      w_start = w_start+ 1
                  if chess_table[k][l] != 'B':
                      b_start = b_start+ 1
                else :
                  if chess_table[k][l] != 'B':
                      w_start =w_start + 1
                  if chess_table[k][l] != 'W':
                      b_start = b_start +1
        cnt.append(w_start)
        cnt.append(b_start)
  • i,j로 하여금 어디서 부터 체스판을 그려야 할지 기준을 정했다
  • k,l의 경우 기준점으로 하여금 해당 체스판을 다시 색칠해야하는 지 아닌지를 확인해야한다.
if (k+l) % 2 ==0:

나는 위 부분에서 이해가 가지 않았는데 위 연산을 해서 구분하는 이유는 체스판의 경우 WBWBWBWB와 같은 식으로 번갈아 가면서 같은 게 나오기 때문이었다.
만약 정상적인 체스판이라면 짝수일 때는 같은 색깔의 타일이 있어야 하는 것이다.

  • 그렇지 않으면 w_start += 1 을 하는 것이다. (타일을 바꿔야 하니까)

홀수인 경우에도 위와 동일하기 때문인데, chess_table[0][0]과 chess_table[1][0]은 달라야 하기 때문에

if chess_table[k][l] != 'B':
	w_start =w_start + 1

위와 같이 if 문을 작성해야하는 것이다.

그리고 나서 W로 시작했을 때와 B로 시작했을 때의 타일을 몇개 바꿨는지를 cnt 리스트에 append 하고

print(min(cnt))로 결과값을 출력한다.


참조

https://god-gil.tistory.com/62

profile
개발합니다. 회고합니다.

0개의 댓글