알고리즘/문제풀이
[Python] Programmers 행렬 테두리 회전하기
정찡이
2021. 7. 24. 19:24
728x90
1. 문제 링크
https://programmers.co.kr/learn/courses/30/lessons/77485
코딩테스트 연습 - 행렬 테두리 회전하기
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]
programmers.co.kr
2. 문제 요약
- 해당 위치를 시계 방향 회전한다. 회전에 의해 바뀐 숫자 중 가장 작은 숫자를 배열에 담아 리턴한다.

3. 아이디어 정리
- 시계 방향으로 회전하기
- 아래 그림과 같은 로직으로 진행된다.
- 왼쪽 > 오른쪽, 위 > 아래, 오른쪽 > 왼쪽, 아래 > 위 순서로 swap 하면서 진행한다.
- 회전한 숫자 중 최소값 찾기

4. 문제 풀이
4-1. 내 풀이
def solution(rows, columns, queries):
"""
시계 방향으로 회전해서 이동한 숫자 중 최솟값 구하기
1. 시계방향 회전
2. 회전한 숫자 저장해서 최솟값 찾기
"""
def rotate(left, right, top, bottom):
"""
시계방향 회전
:return: 위치가 바뀐 숫자 중 가장 작은 값
"""
pre = graph[top][left]
min_num = [pre]
# 왼 > 오
for i in range(left, right + 1):
pre, graph[top][i] = graph[top][i], pre
min_num.append(pre)
# 위 > 아래
for i in range(top + 1, bottom + 1):
pre, graph[i][right] = graph[i][right], pre
min_num.append(pre)
# 오 > 왼
for i in range(right - 1, left - 1, - 1):
pre, graph[bottom][i] = graph[bottom][i], pre
min_num.append(pre)
# 아래 > 위
for i in range(bottom - 1, top - 1, -1):
pre, graph[i][left] = graph[i][left], pre
min_num.append(pre)
return min(min_num)
answer = list()
graph = [[0] * columns for _ in range(rows)]
count = 1
for i in range(rows):
for j in range(columns):
graph[i][j] = count
count += 1
# 회전하면서 결과 담기
for querie in queries:
answer.append(rotate(left=querie[1] - 1, right=querie[3] - 1, top=querie[0] - 1, bottom=querie[2] - 1))
return answer
5. 결론
- 배열 돌리기 문제 ⇒ 구현 문제
반응형