본문 바로가기
[ 알고리즘 ]/오답노트

[ BOJ 오답노트 ] 1018 파이썬 : 체스판 다시 칠하기

by 불주먹고양이 2022. 2. 12.

2022 02 12

 

1. 틀린 기록

 

 

 

2. 원인 분석

- 다른 예제에서는 모두 올바른 출력이 나왔는데, 예제 입력 4에서 오류가 났다.

- 나는 시작하는 체스 판을 기준으로 구했는데, 그러면 안됐던 것이었다.

 

 

 

3. 해결

saero, garo = map(int, input().split())
lst = []            # 입력된 보드의 상태를 저장하는 리스트
errorStorage = []   # 몇 개의 원소를 고쳐야 하는지 저장하는 리스트 -> 나중에 min(errorStorage)

# 입력받기
for i in range(saero):
    lst.append(input())

# 검토하기
for i in range(0, saero-7):
    for j in range(0, garo-7):
        count = 0

        for y in range(i, i+8):
            for x in range(j, j+8):
                if (y-i) % 2 == 0:
                    if (x-j) % 2 == 0:
                        if lst[y][x] == 'B':
                            count += 1
                    else:
                        if lst[y][x] == 'W':
                            count += 1
                else:
                    if (x-j) % 2 == 0:
                        if lst[y][x] == 'W':
                            count += 1
                    else:
                        if lst[y][x] == 'B':
                            count += 1
        errorStorage.append(count)

        count = 0
        for y in range(i, i+8):
            for x in range(j, j+8):
                if (y-i) % 2 == 0:
                    if (x-j) % 2 == 0:
                        if lst[y][x] == 'W':
                            count += 1
                    else:
                        if lst[y][x] == 'B':
                            count += 1
                else:
                    if (x-j) % 2 == 0:
                        if lst[y][x] == 'B':
                            count += 1
                    else:
                        if lst[y][x] == 'W':
                            count += 1
        errorStorage.append(count)

print(min(errorStorage))

- 그래서 맨 처음 시작하는 원소가 'W'인 경우와 'B'인 경우를 나눠서 구하지 않고, 둘 다 구해서 최솟값을 구하도록 코드를 짰다.

 

 

 

4. 배운 점

- 배열의 인덱스 간의 연산으로 더 간단한 식을 만들 수 있다.

- 기준을 잘 세우되, 그 기준도 올바른 기준인지를 다시 꼭!!! 확인하자.