행렬 테두리 회전하기(Programmers 77485)
🧑💻 행렬 테두리 회전하기
- rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다.
- x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.
- 다음은 6 x 6 크기 행렬의 예시입니다.
- 이 행렬에 (2, 2, 5, 4) 회전을 적용하면, 아래 그림과 같이 2행 2열부터 5행 4열까지 영역의 테두리가 시계방향으로 회전합니다. 이때, 중앙의 15와 21이 있는 영역은 회전하지 않는 것을 주의하세요.
- 행렬의 세로 길이(행 개수) rows, 가로 길이(열 개수) columns, 그리고 회전들의 목록 queries가 주어질 때, 각 회전들을 배열에 적용한 뒤, 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한 사항
- rows는 2 이상 100 이하인 자연수입니다.
- columns는 2 이상 100 이하인 자연수입니다.
- 처음에 행렬에는 가로 방향으로 숫자가 1부터 하나씩 증가하면서 적혀있습니다.
- 즉, 아무 회전도 하지 않았을 때, i 행 j 열에 있는 숫자는 ((i-1) x columns + j)입니다.
- queries의 행의 개수(회전의 개수)는 1 이상 10,000 이하입니다.
- queries의 각 행은 4개의 정수 [x1, y1, x2, y2]입니다.
- x1 행 y1 열부터 x2 행 y2 열까지 영역의 테두리를 시계방향으로 회전한다는 뜻입니다.
- 1 ≤ x1 < x2 ≤ rows, 1 ≤ y1 < y2 ≤ columns입니다.
- 모든 회전은 순서대로 이루어집니다.
- 예를 들어, 두 번째 회전에 대한 답은 첫 번째 회전을 실행한 다음, 그 상태에서 두 번째 회전을 실행했을 때 이동한 숫자 중 최솟값을 구하면 됩니다.
입출력 예
rows columns queries result 6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3] 100 97 [[1,1,100,97]] [1]
🧑💻 해결방법
- 리스트에 비어있는 칸을 하나 생성해야한다. tmp로 설정.
- 선분마다 나눠서 한 칸씩 이동해서 값을 적용하면 된다.
🧑💻 코드
def turning(query, frame): turned_num = [] top, left, bottom, right = query[0] - 1, query[1] - 1, query[2] - 1, query[3] - 1 tmp = frame[top][left] for y in range(top, bottom): frame[y][left] = frame[y + 1][left] turned_num.append(frame[y][left]) for x in range(left, right): frame[bottom][x] = frame[bottom][x + 1] turned_num.append(frame[bottom][x]) for y in range(bottom, top, -1): frame[y][right] = frame[y - 1][right] turned_num.append(frame[y][right]) for x in range(right, left, -1): frame[top][x] = frame[top][x - 1] turned_num.append(frame[top][x]) turned_num.append(tmp) frame[top][left + 1] = tmp return frame, min(turned_num) def solution(rows, columns, queries): answer = [] # 틀 형성 frame = [] for i in range(1, rows + 1): tmp = [] for j in range(1, columns + 1): num = ((i - 1) * columns + j) tmp.append(num) frame.append(tmp) # 실행을 위한 구문 for query in queries: frame, minimum = turning(query, frame) answer.append(minimum) return answer
🧑💻 총평
- 퀴즈같은 문제처럼 생각하면 간단하다.
- 아이디어가 떠오르기까지 오랜 시간이 걸렸으나 그 이후는 풀리는데 어렵지 않았다.
- 최근 며칠 간 level2에 상당히 쫄아있었는데 다시 자신감을 얻을 수 있게되었다.
Author And Source
이 문제에 관하여(행렬 테두리 회전하기(Programmers 77485)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@moonpiderman/행렬-테두리-회전하기Programmers-77485저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)