[백준] 체스판 다시 칠하기_1018번

손시연·2022년 4월 9일
0

algorithm

목록 보기
8/18

체스판 다시 칠하기_1018번

코드

# 체스판(2차원 배열) 출력
def pprint(array):
    for line in array:
        for l in line:
            print(l, end=" ")
        print()
    print()


# 8X8 올바른 검정색, 흰색 체스판 만들기
def makingStart(a, b):
    chess = []
    for _ in range(4):
        chess.append([a, b] * 4)
        chess.append([b, a] * 4)
    return chess


# 올바른 체스판과 다른 개수 비교(Brute Force)
def checking(ori, new):
    count = 0
    for i in range(8):
        for j in range(8):
            if ori[i][j] != new[i][j]:
                count += 1
    return count


# 검정색, 흰색으로 시작하는 올바른 체스판 형성
black = makingStart("B", "W")
white = makingStart("W", "B")

n, m = map(int, input().split())
chess = []
for _ in range(n):
    chess.append(list(input()))

# 8X8 체스판 여러개 만들기
partion = []
partions = []
for i in range(n-7):
    for j in range(m-7):
        for tmp in chess[i:i+8]:
            partion.append(tmp[j:j+8])
        partions.append(partion)
        partion = []

answer = []
for part in partions:
    answer.append(checking(black, part))
    answer.append(checking(white, part))

print(min(answer))

풀이노트

  1. 검정색, 흰색으로 시작하는 올바른 체스판 형성
black = makingStart("B", "W")
white = makingStart("W", "B")
  1. 입력받은 체스판은 [ ["B", "W", ...] , ["W", "B", ... ], ... ] 과 같이 2차원 형태임

  2. 8X8 체스판 여러개 만들기 -> partions에 모아둠

  3. part 들이 흰색으로 시작할지, 검정색으로 시작할지 모름
    checking 함수를 검정색, 흰색인 경우 모두 확인함
    checking 함수는 Brute Force 방식으로 올바른 체스판과 part의 다른 개수를 비교하고, 그 값을 return 함

  4. answer에 checking 한 값을 모두 저장하고, answer의 최소값을 출력함


다른 방식의 풀이

# 올바른 체스판과 다른 개수 비교(Brute Force)
def checking(chess):
    num = 0
    for i in range(0, 8, 2):
        num += (chess[i][0:8:2].count("W") + chess[i][1:8:2].count("B")
                + chess[i+1][0:8:2].count("B") + chess[i+1][1:8:2].count("W"))
    return min(num, 64-num)


n, m = map(int, input().split())
chess = []
for _ in range(n):
    chess.append(list(input()))

# 8X8 체스판 여러개 만들기
partion = []
partions = []
for i in range(n-7):
    for j in range(m-7):
        for tmp in chess[i:i+8]:
            partion.append(tmp[j:j+8])
        partions.append(partion)
        partion = []

answer = []
for part in partions:
    answer.append(checking(part))

print(min(answer))

올바른 체스판을 형성하여 푸는 방식은 메모리 낭비가 심함.
makingStart 함수를 없애고, checking 함수를 for 문 형태로 해도 됨

  • 삼항 연산자
    • 형태 : [True] if [Condition] else [False]
    • 예) print("짝수") if a % 2 == 0 else print("홀수")

소요시간 : 3시간(첫번째 풀이), 1시간 30분(두번째 풀이)

profile
Server Engineer

0개의 댓글