title: "[프로그래머스] 고고학 최고의 발견 Python 파이썬 해설 (Level 3) - 이도훈"
cleanUrl: "programmers/131702"
description: "프로그래머스 Level 3 문제 [고고학 최고의 발견]의 풀이를 정리합니다."

문제 설명 및 제한사항

아이디어 및 해결 방법

코드

from copy import deepcopy
from math import inf
from itertools import product

def turn(board, r, c, n):
    for dr, dc in [(-1, 0), (0, 1), (1, 0), (0, -1), (0, 0)]:
        if 0 <= r+dr < len(board) and 0 <= c+dc < len(board[0]):
            board[r+dr][c+dc] = (board[r+dr][c+dc] + n) % 4
            
def finished(board):
    for x in board[-1]:
        if x != 0:
            return False
    return True

def solution(clockHands):
    board = clockHands
    length = len(board)
    
    answer = inf
    for ns in product([0, 1, 2, 3], repeat=length):
        cnt = 0
        
        newboard = deepcopy(board)
        # 첫 줄을 돌려봅니다.
        for c, n in zip(range(length), ns):
            turn(newboard, 0, c, n)
            cnt += n
            
        # 첫 줄을 모두 0으로 만들기 위해서 둘째 줄을 돌리고,
        # 둘째 줄을 모두 0으로 만들기 위해서 셋째 줄을 돌리고,
        # length-1번째 줄을 모두 0으로 만들기 위해서 length번째 줄을 돌립니다.
        for r in range(1, length):
            for c in range(length):
            	if (x := newboard[r-1][c]) != 0:
                    turn(newboard, r, c, (4 - x) % 4)
                    cnt += (4 - x) % 4
                    
        # 전부 0이 되었으면, 최솟값을 업데이트합니다.
        if finished(newboard):
            answer = min(answer, cnt)
            
    return answer

출처

프로그래머스 코딩테스트 연습 https://school.programmers.co.kr/learn/challenges