📌 프로그래머스 [행렬 테두리 회전하기]
🔗 문제 링크
문제 설명 📄
rows × columns
크기의 행렬이 주어지며, 일부 영역의 테두리를 시계방향으로 회전시키는 연산을 수행해야 한다.
각 회전 후, 회전된 값들 중 최솟값을 반환하는 문제.
문제 접근 방식 💡
- 2차원 배열을 생성하여 초기 행렬을 구성.
- 주어진
queries
를 순회하며 해당 범위의 테두리를 회전. - 회전 과정:
- 상, 우, 하, 좌 순서로 테두리를 이동.
- 이동 중 만난 숫자들의 최솟값을 추출.
- 최솟값을
answer
리스트에 추가 후 반환.
Solution 💻
def solution(rows, columns, queries):
answer = []
arr = [[i + (columns * j) for i in range(1, columns + 1)] for j in range(rows)]
def circle(x, y, px, py, arr):
dx, dy = x, y
temp = arr[x][y]
result = [temp]
while dy < py:
dy += 1
arr[dx][dy], temp = temp, arr[dx][dy]
result.append(temp)
while dx < px:
dx += 1
arr[dx][dy], temp = temp, arr[dx][dy]
result.append(temp)
while dy > y:
dy -= 1
arr[dx][dy], temp = temp, arr[dx][dy]
result.append(temp)
while dx > x:
dx -= 1
arr[dx][dy], temp = temp, arr[dx][dy]
result.append(temp)
return min(result)
for querie in queries:
answer.append(circle(querie[0] - 1, querie[1] - 1, querie[2] - 1, querie[3] - 1, arr))
return answer
시간 복잡도 분석 ⏲️
- 시간 복잡도:
O(q * (r + c))
q
는queries
개수,r
과c
는 회전 영역의 크기.- 각 회전 연산에서
O(r + c)
연산 수행.
공간 복잡도 분석 🗄️
- 공간 복잡도:
O(rows × columns)
- 행렬 저장을 위한 배열 사용.
리팩토링 🛠️
def solution(rows, columns, queries):
arr = [[i + (columns * j) for i in range(1, columns + 1)] for j in range(rows)]
answer = []
for x1, y1, x2, y2 in queries:
x1, y1, x2, y2 = x1 - 1, y1 - 1, x2 - 1, y2 - 1
temp = arr[x1][y1]
min_val = temp
for i in range(x1, x2):
arr[i][y1] = arr[i + 1][y1]
min_val = min(min_val, arr[i][y1])
for i in range(y1, y2):
arr[x2][i] = arr[x2][i + 1]
min_val = min(min_val, arr[x2][i])
for i in range(x2, x1, -1):
arr[i][y2] = arr[i - 1][y2]
min_val = min(min_val, arr[i][y2])
for i in range(y2, y1, -1):
arr[x1][i] = arr[x1][i - 1]
min_val = min(min_val, arr[x1][i])
arr[x1][y1 + 1] = temp
answer.append(min_val)
return answer
시간 복잡도 분석 ⏲️
- 시간 복잡도:
O(q * (r + c))
q
는queries
개수,r
과c
는 회전 영역 크기.- 개선된 코드도 동일한 시간 복잡도를 유지.
공간 복잡도 분석 🗄️
- 공간 복잡도:
O(rows × columns)
- 추가적인 배열 사용 없이 기존 행렬을 변형.
✅ 리팩토링된 코드의 개선점
- 코드 간결화:
circle
함수를 제거하고 직접 처리. - 직관적인 회전 과정: 방향별로 처리하여 가독성 향상.
- 최솟값 계산 최적화:
min()
을 반복 호출하는 대신 루프 내에서 비교.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 [거리두기 확인하기] (0) | 2025.03.01 |
---|---|
프로그래머스 [서버 증설 횟수] (0) | 2025.03.01 |
프로그래머스 [디펜스 게임] (0) | 2025.02.19 |
프로그래머스 [리코쳇 로봇] (1) | 2025.02.18 |
프로그래머스 [수식 최대화] (0) | 2025.02.18 |