Coding Test
[프로그래머스] 행렬 테두리 회전하기 - Python
쌩욱
2021. 10. 24. 21:47
문제 설명
rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다.
- x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.
- 행렬의 세로 길이(행 개수) rows, 가로 길이(열 개수) columns, 그리고 회전들의 목록 queries가 주어질 때, 각 회전들을 배열에 적용한 뒤, 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.
풀이
구현 문제입니다. 회전 목록으로 반복문을 돌리며 한 단계씩 수행해 최소값을 찾았습니다.
최소값은 매 단계마다 set에 회전한 숫자를 넣고 최소값을 찾아서 정답에 추가했습니다.
회전하는 방법은 시계 방향으로 회전해야하기 때문에 반시계 방향으로 현재 원소와 다음 원소를 스왑해주며 한 바퀴를 돌고 마지막에는 반복문 횟수를 하나 줄여주면 결과적으로 시계방향으로 한칸씩 회전한 모습이 됩니다.
전체 코드입니다.
처음 붙잡고 가는 원소를 한 바퀴 뺑 돌려 여행시켜주는 느낌으로 꼬우
def solution(rows, columns, queries):
answer = []
graph = [[] for _ in range(rows)]
cnt = 1
for i in range(rows):
for j in range(columns):
graph[i].append(cnt)
cnt+=1
for x1,y1,x2,y2 in queries:
x1 -= 1
y1 -= 1
x2 -= 1
y2 -= 1
mins = []
# 윗변
for y in range(y2, y1, -1):
graph[x1][y-1], graph[x1][y] = graph[x1][y], graph[x1][y-1]
mins.append(graph[x1][y-1])
mins.append(graph[x1][y])
#왼쪽 변
for x in range(x1,x2):
graph[x][y1], graph[x+1][y1] = graph[x+1][y1], graph[x][y1]
mins.append(graph[x][y1])
mins.append(graph[x+1][y1])
#아래 변
for y in range(y1, y2):
graph[x2][y], graph[x2][y+1] = graph[x2][y+1], graph[x2][y]
mins.append(graph[x2][y])
mins.append(graph[x2][y+1])
#오른쪽 변
#마지막 반복문에서 for문 도는 횟수를 1 줄여서 회전을 완성시킨다.
for x in range(x2, x1+1, -1):
graph[x][y2], graph[x-1][y2] = graph[x-1][y2], graph[x][y2]
mins.append(graph[x][y2])
mins.append(graph[x-1][y2])
# for i in range(len(graph)):
# print(graph[i])
#
# print("--------------")
mins = set(mins)
minNum = min(mins)
answer.append(minNum)
return answer