[Python] 1018 체스판 다시 칠하기 - 브루트포스(완전탐색)

Saemi Min·2023년 3월 10일
0

BaekJoon

목록 보기
24/30
post-thumbnail

실버4

문제

해당 문제 링크

내 정답

## 체스판 다시 칠하기 - 실버 4

a, b= map(int, input().split())

n=[]
m=[]
for _ in range(a):
    k=input()
    m.append(k)
    
x=0
res=[]

cl=[]
dl=[]

c='W'
d='B'

cl.append(c)
dl.append(d)

for j in range(63):
    if cl[j]==c and (j+1)%8!=0:
        cl.append(d)
        dl.append(c)
    elif cl[j]==d and (j+1)%8!=0:
        cl.append(c)
        dl.append(d)
    elif cl[j]==c and (j+1)%8==0:
        cl.append(c)
        dl.append(d)
    elif cl[j]==d and (j+1)%8==0:
        cl.append(d)
        dl.append(c)

x, y=0, 0

for i in range(a-7):
    for j in range(b-7):
        for e in range(i, i+8):
            for f in range(j, j+8):
                n.append(m[e][f])
   
        for r in range(64):
            if n[r]!=cl[r]:
                x+=1
            if n[r]!=dl[r]:
                y+=1
            
        
        res.append(x)
        res.append(y)
        n=[]
        x=0
        y=0

print(min(res))

내 풀이

## 체스판 다시 칠하기 - 실버 4

a, b= map(int, input().split())

n=[]
for i in range(a):
    n+=list(input())
    # n.append(k)
    

x=0

cl=[]
dl=[]

c='W'
d='B'

cl.append(c)
dl.append(d)

for j in range(a*b-1):
    if cl[j]==c and (j+1)%b!=0:
        cl.append(d)
        dl.append(c)
    elif cl[j]==d and (j+1)%b!=0:
        cl.append(c)
        dl.append(d)
    elif cl[j]==c and (j+1)%b==0:
        cl.append(c)
        dl.append(d)
    elif cl[j]==d and (j+1)%b==0:
        cl.append(d)
        dl.append(c)

x, y=0, 0

for i in range(a*b):
    if n[i]!=cl[i]:
        x+=1
    if n[i]!=dl[i]:
        y+=1

print(min(x, y))

정답으로 해당되는 체스판을 미리 만들어놓고 비교하고자 했다.
흰색으로 시작하는 체스판, 검은색으로 시작하는 체스판 이렇게 2개를 만들어놓았다.
다 만들어놓고 이제 됐다 싶었는데 잘못된 답이 나왔다.
다시 문제를 보니 큰 보드 중 8*8 체스판으로 잘라낸 후에 잘못된 정사각형을 찾는 것이었다..

역시 문제를 제대로 꼼꼼히 읽어야 한다...ㅠㅠㅠ

그래서 내 방식대로 코드를 작성했다. 생각보다 오랜 시간 작성해서 해결했다.
그래도 스스로 해결해서 뿌듯하다!

이후 다른 사람의 코드를 보고 더 짧게 작성하는 방법을 알 수 있었다.

다른 사람 정답 및 풀이

n,m=map(int,input().split())

mtr=[]
cnt=[]
for i in range(n):
    mtr.append(input())
    
for a in range(n-7):
    for b in range(m-7):#8*8로 자르기 위해, -7해준다
        w_index=0 #흰색으로 시작
        b_index=0 #검은색으로 시작
        for i in range(a,a+8):#시작지점
            for j in range(b,b+8):#시작지점
                if (i+j)%2==0:#짝수인 경우
                    if mtr[i][j]!='W':#W가 아니면, 즉 B이면
                        w_index+=1#W로 칠하는 갯수
                    else:#W일 때
                        b_index+=1#B로 칠하는 갯수
                else:#홀수인 경우
                    if mtr[i][j]!='W':#W가 아니면, 즉 B이면
                        b_index+=1#B로 칠하는 갯수
                    else:
                        w_index+=1#W로 칠하는 갯수
                        
        cnt.append(w_index) #W로 시작할 때 경우의 수
        cnt.append(b_index) #B로 시작할 때 경우의 수
print(min(cnt))
profile
I believe in myself.

0개의 댓글