zooooss

[Python3] 백준 1018번 체스판 다시 칠하기- strip(), float('inf') 본문

STUDY/Algorithm

[Python3] 백준 1018번 체스판 다시 칠하기- strip(), float('inf')

zooooss 2025. 12. 12. 15:13

문제내용 요약

: 주어진 체스판에서 8x8 크기의 부분을 슬라이딩하며, 각 부분을 올바른 체스판(체스판은 두 가지 색을 번갈아 칠해야 함)으로 만들기 위해 최소한의 칸만 칠하는 방법을 찾는 문제

 

 

학습개념

1. strip() : 문자열 양옆의 공백이나 줄바꿈문자 제거하는 함수 - 때에 따라 특정한걸 제거하는 것도 가능함

2. float('inf') : 무한대를 표현하는 값

 

내 이전 오답코드의 문제점

 

문제점 1. 최소값들을 비교해 결과를 나타내기 위해, res를 빈 배열로 초기화한 후 min(countW,countB)로 배열을 계속 담고,

마지막에 print(min(res))로 전체 배열의 최소값을 추출하는 방법을 사용했었음

=> 이는 불필요한 리스트저장으로 인해 메모리 효율을 저하시켰음.

해결점 => res에 무한값을 나타내는 float('inf')로 초기화한 값으로 매번 최소값과 비교해 갱신하는 방법을 사용

 

문제점 2. chess에 입력받은 전체 배열을 받을 때, strip()함수를 사용하지않아 다음 행으로 넘어가는 널 문자도 한 리스트의 끝마다

받게되었음

해결점 => strip함수로 '₩0'제거해줌으로써 문자열 제대로 담고, 나중에 문제없이 처리&비교 가능

 

 

결과 코드

m,n=map(int,input().split())
chess=[list(input().strip())for _ in range(m)]
res=float('inf')
for i in range(m-7):
    for j in range(n-7):
        countW,countB=0,0
        for x in range(8):
            for y in range(8):
                first = chess[i+x][j+y]
                if (x+y)%2==0:
                    if first != 'W':
                        countW+=1
                    if first != 'B':
                        countB+=1
                else:
                    if first != 'W':
                        countB+=1
                    if first != 'B':
                        countW+=1
        res = min(res,countW,countB)
print(res)