데이터사이언스 기록기📚

[백준/Python] 1018번(브루트포스 알고리즘)_체스판 다시 칠하기 본문

Coding Test/백준(Python)

[백준/Python] 1018번(브루트포스 알고리즘)_체스판 다시 칠하기

syunze 2023. 4. 18. 14:01

📌문제 유형

브루트포스 알고리즘(실버4)

 

📌문제

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

 

📌나의 문제풀이

n,m = map(int,input().split())
graph = []

for _ in range(n):
    graph.append(list(input()))

# 8 * 8로 자르기
def cut(graph,i,j):
    new_graph = []

    for k in range(i,i+8):
        new_graph.append(graph[k][j:j+8])

    return new_graph

# 8 * 8 잘라넣어서 확인하기
def check(new_graph):
    w_first = ['W','B','W','B','W','B','W','B']
    b_first = ['B','W','B','W','B','W','B','W']
    ans_b, ans_w = 0, 0

    for i in range(len(new_graph)):
        for j in range(len(new_graph[0])):
            if i % 2 == 0:
                if new_graph[i][j] != b_first[j]:
                    ans_b += 1
            else:
                if new_graph[i][j] != w_first[j]:
                    ans_b += 1


    for i in range(len(new_graph)):
        for j in range(len(new_graph[0])):
            if i % 2 == 0:
                if new_graph[i][j] != w_first[j]:
                    ans_w += 1
            else:
                if new_graph[i][j] != b_first[j]:
                    ans_w += 1
    return min(ans_w, ans_b)

min_ans = 64
for i in range(n-7):
    for j in range(m-7):
        new_graph = cut(graph,i,j)
        ans = check(new_graph)
        if ans < min_ans:
            min_ans = ans
print(min_ans)

 

📌 다른사람의 문제풀이

- k+l 짝수인 경우, 홀수인 경우가 체스판 모양과 동일!

 

[백준 알고리즘/python] 백준 1018번 체스판 다시 칠하기, 파이썬 설명

백준 알고리즘의 브루트 포스 단계, 1018번 체스판 다시 칠하기를 파이썬으로 풀어보았다. 문제 출처 https://www.acmicpc.net/problem/1018 1018번: 체스판 다시 칠하기 첫째 줄에 N과 M이 주어진다. N과 M은 8

god-gil.tistory.com

N, M = map(int, input().split())
board = list()
for i in range(N):
    board.append(input())
repair = list()

for i in range(N-7):
    for j in range(M-7):
        first_W = 0
        first_B = 0
        for k in range(i,i+8):
            for l in range(j,j + 8):
                if (k + l) % 2 == 0:
                    if board[k][l] != 'W':
                        first_W = first_W+1
                    if board[k][l] != 'B':
                        first_B = first_B + 1
                else:
                    if board[k][l] != 'B':
                        first_W = first_W+1
                    if board[k][l] != 'W':
                        first_B = first_B + 1
        repair.append(first_W)
        repair.append(first_B)

 

📌 리뷰 

- B,W 둘 다 시작하는거 확인하고 그 중 작은값 출력!

  • 둘 중 하나 특정해서 계속 틀렸었음
728x90
Comments