Baekjoon Case

[백준 #1018] 체스판 칠하기 - 파이썬(python)

Scarlett_C 2021. 8. 10. 14:25
728x90

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

이 번 문제는 일단 코드를 짜고 나서 

다른 사람들이 짠 코드를 봤는데,

 

역시,, 코딩 결과는 같아도 사람마다 성격이 다르다는 것을 알았다

N,M=map(int,input().split())
chess=[[0 for i in range(M)] for j in range(N)]
verlist=[[0 for i in range(M)] for j in range(N)]
changecnt=[]
for i in range(N):
    temp=input()
    j=0
    for a in temp:
        chess[i][j]=a
        j+=1
for i in range(N):
    for j in range(M):
        if i%2==0:
            if j%2==0:
                if chess[i][j]!='W':verlist[i][j]=1
            else:
                if chess[i][j]=='W':verlist[i][j]=1
                
        else:
            if j%2==0:
                if chess[i][j]=='W':verlist[i][j]=1
            else:
                if chess[i][j]!='W':verlist[i][j]=1
       
for i in range(N-7):
    for j in range(M-7):
        cnt=0
        for a in range(8):
            for b in range(8):
                cnt=cnt+verlist[i+a][j+b]
                
        if cnt<=32:changecnt.append(cnt)
        else: changecnt.append(64-cnt)

print(min(changecnt))

처음에는 일단 입력받은 체스칸을 첫 칸이 하얀색인 체스판으로 바꿀 때,

변동사항이 있는 부분만 값이 1로 바뀌도록 코드를 짰다.

 

첫 칸이 검은색인 체스판으로 바꾸는 것도 짰었는데,

생각 해 보니 첫칸이 하얀색인 체스판 기준으로 했을때의 반대로 생각하면 되는거라서 따로 코드를 안짰다.

 

1,0 값으로만 되어 있는 클론 리스트를 기준으로 8*8 로 모두 합해서

가장 적은 숫자를 출력하는 것으로 풀이했다.

 

값이 32(64의 반)이 넘어가는 경우에는 64에서 그 수를 뺀 값을 리스트에 추가했다.

(첫 칸을 하얀색으로 하는게 까만색으로 하는 것 보다 더 많은 변동사항이 있기 때문)

N,M=map(int,input().split())
chess=[[0 for i in range(M)] for j in range(N)]
changecnt=[]
for i in range(N):
    temp=input()
    j=0
    for a in temp:
        chess[i][j]=a
        j+=1
for i in range(N-7):
    for j in range(M-7):
        cnt=0
        for a in range(8):
            for b in range(8):
                if (i+a)%2==0:
                    if (j+b)%2==0:
                        if chess[i+a][j+b]!='W':cnt+=1
                    else:
                        if chess[i+a][j+b]=='W':cnt+=1
                
                else:
                    if (j+b)%2==0:
                        if chess[i+a][j+b]=='W':cnt+=1
                    else:
                        if chess[i+a][j+b]!='W':cnt+=1
        if cnt<=32:changecnt.append(cnt)
        else: changecnt.append(64-cnt)

print(min(changecnt))

사람들이 풀이 한 것을 보고

굳이 변동 된 값의 배열을 생성 안하고, 변동사항이 있으면 값이 1씩 올라가는 것으로 코드를 짰다.

 

결과는 똑같은데 시간은 처음 풀이한 것이 조금 더 짧은 것 보니 한 번에 다 바꿔놓고 verifying 하는게 더 나은가보다.

 

아마도 두 번째 코드는 이전 8*8 체스판에 포함되어 있던 값들도 새로 다시 연산해야 해서 그런것 같음

코드는 두 번째 코딩이 조금 더 깔끔 해 보인다.

728x90