1018 : 체스판 다시 칠하기

koeyhoyh·2021년 7월 17일
0

Algorithm

목록 보기
1/16


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


작성했는데 틀린 문장.

테스트 케이스도 다 맞고 내가 생각하기로는 분명히 다 검사 후 체크를 하는데 왜 틀렸습니다가 나오는지 궁금했다.


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

chessboard = [[] * m ] * n

# 체스판의 값을 입력받음
for i in range(n) :
    tmp_arr = list(input())
    chessboard[i] = (tmp_arr)
    
# 체스판에서 바꾸어야 할 값이 몇개인지 찾는다.
tmp = 65

k = 0
l = 0

while(True) :
    changeCount = 0
    for i in range (4) :
        qq = i * 2

        for j in range (4) :
            pp = j * 2

            if (chessboard[k][l] == 'B') : # 체스판은 2개의 행이 반복되므로 이렇게 체크를 해주었다.
                
                if (chessboard[qq + k][pp + l] == 'W') :
                    changeCount += 1
                
                if (chessboard[qq + k][pp + 1 + l] == 'B') :
                    changeCount += 1
                
                if (chessboard[qq + 1 + k][pp + l] == 'B') :
                    changeCount += 1
                    
                if (chessboard[qq + 1 + k][pp + 1 + l] == 'W') :
                    changeCount += 1

            else :
                
                if (chessboard[qq + k][pp + l] == 'B') :
                    changeCount += 1
                
                if (chessboard[qq + k][pp + l + 1] == 'W') :
                    changeCount += 1
                
                if (chessboard[qq + 1 + k][pp + l] == 'W') :
                    changeCount += 1
                    
                if (chessboard[qq + 1 + k][pp + 1 + l] == 'B') :
                    changeCount += 1
    
#    print(k, l)
# 여기서 k과 l을 증가시켜주는데 전체 다 체크해주지 않아서 오류가 발생했던 것 같다.
# 예제에서는 파악이 되지 않아 임의로 체크해보았다.
    if (tmp > changeCount) :
        tmp = changeCount
    
    if (l < m - 7) :
        l += 1
    
    if (l == m - 7) :
        l = 0
        k += 1
            
        if (k > n - 8) :
            break

print(tmp)

해결 방법 :

나는 문제의 정의에서 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우 를 생각해서 처음에 조건문으로 적어주었는데 그 말이 아니었다.

왼쪽 위 칸이 흰색이라고 가정한 경우에 얼마나 더 칠해주어야 하는지,
왼쪽 위 칸이 검정색이라고 가정한 경우에 얼마나 더 칠해주어야 하는지를 비교해 더 적은 수의 값을 얻어오면 되는 문제였다.

예)
8 8
WWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB

내 코드의 출력 : 63

정답 : 1

해결한 코드

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

chessboard = [[] * m ] * n

# 체스판의 값을 입력받음
for i in range(n) :
    tmp_arr = list(input())
    chessboard[i] = (tmp_arr)
    

k = 0
l = 0
tmp2 = 65

while(True) :
    changeCount_B = 0
    changeCount_W = 0

    for i in range (4) :
        qq = i * 2

        for j in range (4) :
            pp = j * 2
                
            if (chessboard[qq + k][pp + l] == 'W') :
                    changeCount_B += 1
                
            if (chessboard[qq + k][pp + 1 + l] == 'B') :
                    changeCount_B += 1
                
            if (chessboard[qq + 1 + k][pp + l] == 'B') :
                    changeCount_B += 1
                    
            if (chessboard[qq + 1 + k][pp + 1 + l] == 'W') :
                    changeCount_B += 1


            if (chessboard[qq + k][pp + l] == 'B') :
                    changeCount_W += 1
                
            if (chessboard[qq + k][pp + l + 1] == 'W') :
                    changeCount_W += 1
                
            if (chessboard[qq + 1 + k][pp + l] == 'W') :
                    changeCount_W += 1
                    
            if (chessboard[qq + 1 + k][pp + 1 + l] == 'B') :
                    changeCount_W += 1

    tmp = min(changeCount_W, changeCount_B)

    if(tmp < tmp2) :
        count_min = tmp
        tmp2 = count_min
    
    if (l < m - 7) :
        l += 1
    
    if (l == m - 7) :
        l = 0
        k += 1
            
        if (k > n - 8) :
            break

print(count_min)

오랜만에 문제를 푸니 그 와중에 코드를 조금 많이 번거롭게 짜 놓은 것 같다.
다음에 문제를 풀 때는 간결하게, 다른 사람이 볼 때도 쉽게 이해할 수 있게 짜도록 노력해야겠다.

profile
내가 만들어낸 것들로 세계에 많은 가치를 창출해내고 싶어요.

0개의 댓글