Загружаем каталог…
Загружаем каталог…
문제 요약 n x n 시계 격자에서 한 시계를 조작하면 자기 자신과 상하좌우 인접 시계가 시계 방향으로 90도 회전한다. 모든 시곗바늘을 12시 방향인 0 으로 만들기 위한 최소 조작 횟수를 구한다. 시계 방향은 0, 1, 2, 3 으로 표현하며 모든 변화는 mod 4 연산으로 처리할 수 있다. 핵심 관찰 1. 같은 시계는 최대 3번만 조작하면 된다 한 시계를 4번 조작하면 영향을 받는 모든 시계가 한 바퀴 돌아 원래 상태로 돌아온다. 따라서 최적해에서 각 시계의 조작 횟수는 0 , 1 , 2 , 3 번 중 하나만 고려하면 충분하다. 2. 첫 행을 제외한 행의 조작은 강제로 결정된다 r 행의 시계를 조작할 수 있는 시점에는 r - 1 행을 더 이상 바꿀 수 있는 방법이 거의 없다. r - 1 행의 c 열 시계에 영향을 주는 아래 행의 조작은 오직 (r, c) 의 조작뿐이다. 그러므로 (r - 1, c) 를 0 으로 만들기 위해 (r, c) 를 몇 번 조작해야 하는지는 다음처럼 유일하게 결정된다. count = (-board[r - 1][c]) % 4 첫 행의 조작 횟수만 정하면, 둘째 행부터 마지막 행까지의 조작 횟수는 모두 자동으로 정해진다. 풀이 과정 첫 행의 각 칸을 0~3 번 조작하는 모든 경우를 탐색한다. 첫 행 조작을 격자에 적용한다. r = 1 부터 마지막 행까지 순회한다. 바로 위 행의 각 시계를 0으로 만들기 위해 현재 행의 같은 열 시계를 필요한 횟수만큼 조작한다. 마지막 행이 모두 0인 경우, 조작 횟수 최솟값을 갱신한다. 첫 행의 경우의 수는 최대 4^8 = 65,536 개이므로 충분히 탐색할 수 있다. Python 코드 from itertools import product def solution(clockHands): n = len(clockHands) answer = float("inf") dr = [0, -1, 1, 0, 0] dc = [0, 0, 0, -1, 1] def rotate(board, row, col, count): """(row, col)을 count번 조작한 결과를 보드에 반영한다.""" for direction in range(5): nr = row + dr[direction] nc = col + dc[direction] if 0 <= nr < n and 0 <= nc < n: board[nr][nc] = (board[nr][nc] + count) % 4 # 첫 행의 모든 조작 조합을 시도한다. for first_row in product(range(4), repeat=n): board = [row[:] for row in clockHands] operation_count = sum(first_row) # 첫 행 조작을 적용한다. for col, count in enumerate(first_row): if count: rotate(board, 0, col, count) # 현재 행을 조작해 바로 위 행을 0으로 확정한다. for row in range(1, n): for col in range(n): count = (-board[row - 1][col]) % 4 if count: rotate(board, row, col, count) operation_count += count # 마지막 행도 모두 0이면 유효한 해다. if all(clock == 0 for clock in board[-1]): answer = min(answer, operation_count) return answer 정당성 설명 첫 행의 각 칸은 0~3번만 조작하면 되므로, 알고리즘은 가능한 첫 행 조작 조합을 모두 탐색한다. 임의의 첫 행 조작 조합을 고정하자. r - 1 행 c 열에 영향을 주는 아직 선택되지 않은 조작은 (r, c) 뿐이다. 따라서 이 시계를 0 으로 만들려면 (r, c) 를 (-board[r - 1][c]) mod 4 번 조작해야 하며, 다른 횟수로는 r - 1 행을 0으로 확정할 수 없다. 그러므로 고정된 첫 행 조합에 대해 알고리즘이 계산한 이후 행의 조작은 유일하며, 그 조합에서 가능한 해가 존재한다면 반드시 찾아낸다. 모든 첫 행 조합을 탐색하므로 모든 가능한 해를 검토하고, 그중 최소 조작 횟수를 반환한다. 복잡도 분석 첫 행의 조작 조합은 4^n 개다. 각 조합마다 n^2 개의 칸을 처리하고, 한 번의 조작 반영은 최대 5개 칸에만 영향을 준다. 시간 복잡도: O(4^n * n^2) 공간 복잡도: O(n^2) n <= 8 이므로 최대 65,536 개의 첫 행 조합만 확인하면 된다. 주의할 점 조작 횟수는 board[row - 1][col] 이 아니라 그 음수의 mod 4 값이다. 현재 값이 3 이면 한 번 조작해 0 으로 만들어야 한다. 현재 행을 처리할 때는 반드시 바로 위 행 을 0으로 확정해야 한다. 마지막 행은 아래에서 보정할 행이 없으므로, 모든 값이 0인지 직접 검사해야 한다. 보드마다 독립적으로 시뮬레이션해야 하므로, 첫 행 조합을 바꿀 때 원본 배열을 깊은 복사해야 한다. 마무리 행 단위로 보면 첫 행만 선택이고 나머지는 강제 전이라는 구조가 보인다. 첫 행의 작은 경우의 수를 완전탐색하고, 이후 행을 위에서 아래로 확정해 나가면 최소 조작 횟수를 구할 수 있다.
То, что RADAR обнаружил и классифицировал для этой возможности. Это опубликованный источником текст, а не подтверждение, что предложение ещё действует.
[프로그래머스] 고고학 최고의 발견. 문제 요약 n x n 시계 격자에서 한 시계를 조작하면 자기 자신과 상하좌우 인접 시계가 시계 방향으로 90도 회전한다. 모든 시곗바늘을 12시 방향인 0 으로 만들기 위한 최소 조작 횟수를 구한다. 시계 방향은 0, 1, 2, 3 으로 표현하며 모든 변화는 mod 4 연산으로 처리할 수 있다. 핵심 관찰 1. 같은 시계는 최대 3번만 조작하면 된다 한 시계를 4번 조작하면 영향을 받는 모든 시계가 한 바퀴 돌아 원래 상태로 돌아온다. 따라서 최적해에서 각 시계의 조작 횟수는 0 , 1 , 2 , 3 번 중 하나만 고려하면 충분하다. 2. 첫 행을 제외한 행의 조작은 강제로 결정된다 r 행의 시계를 조작할 수 있는 시점에는 r - 1 행을 더 이상 바꿀 수 있는 방법이…
Открыть источник