====== 행렬 테두리 회전하기 ====== ===== 풀이 ===== * 그냥 단순하게, 매 회전 명령마다 실제 행렬을 회전시키면서 처리하면 된다. * 데이터 구조를 어찌어찌 잘 만들면 좀더 효율적인 알고리즘이 있을것 같기도 한데 생각해내지는 못했다.. 어차피 행과 열 사이즈가 100 이하라서 효율적인 방법이 존재하더라도 실제 수행 시간은 별 차이 없을것이다.. * 한번 회전시킬때 이동될 숫자의 갯수는 O(r + c) 이므로, 시간복잡도도 O(r + c). n개의 쿼리를 수행하는데에는 O(n(r+c))가 걸린다. * 알고리즘은 간단하지만, 구현은 조금 지저분하다. 그나마 깔끔하게 해보려고 이동할 숫자들의 위치들을 돌려주는 제너레이터를 만들어서 구현해봤는데 그래도 지저분한 부분이 있는것은 어쩔수 없다. ===== 코드 ===== """Solution code for "Programmers 77485. 행렬 테두리 회전하기". - Problem link: https://programmers.co.kr/learn/courses/30/lessons/77485 - Solution link: http://www.teferi.net/ps/problems/programmers/77485 """ import itertools def border_positions(x1, y1, x2, y2): return itertools.chain(((x - 1, y1 - 1) for x in range(x1, x2 + 1)), ((x2 - 1, y - 1) for y in range(y1, y2 + 1)), ((x - 1, y2 - 1) for x in range(x2, x1 - 1, -1)), ((x1 - 1, y - 1) for y in range(y2, y1 - 1, -1))) def solution(rows, columns, queries): answers = [] i = 0 grid = [[(i := i + 1) for _ in range(columns)] for _ in range(rows)] for query in queries: positions = border_positions(*query) prev_positions = border_positions(*query) x, y = next(prev_positions) tmp = grid[x][y] for (x, y), (prev_x, prev_y) in zip(positions, prev_positions): grid[x][y] = grid[prev_x][prev_y] grid[x][y] = tmp answers.append(min(grid[x][y] for x, y in border_positions(*query))) return answers {{tag>프로그래머스 ps:problems:programmers:Level_2}}