-
Notifications
You must be signed in to change notification settings - Fork 0
Closed
Description
💬 문제
https://school.programmers.co.kr/learn/courses/30/lessons/77485
💬 Idea
-
rows, columns 크기의 행렬을 생성한다
-
쿼리를 돌면서 행렬 테두리를 회전시킨다
[ 행렬 테두리 회전 로직 ]
- ㅡ : 시작 y 고정 / 시작 x+1 부터 끝 x까지 돌면서 좌표의 이전 좌표값으로 바꿔준다.
- ㅡ : 끝 y 고정 / 끝 x-1 부터 시작 x까지 돌면서 좌표의 이전 좌표값으로 바꿔준다.
- |
- 시작좌표값을 처음에 저장한 시작점에 들어가야할 숫자로 바꿔준다.
💬 풀이
var ans: [Int] = []
func solution(_ rows:Int, _ columns:Int, _ queries:[[Int]]) -> [Int] {
var arr: [[Int]] = []
// 행렬 생성
for i in 0..<rows {
arr.append([Int]((i * columns) + 1...(i * columns) + columns))
}
for query in queries {
arr = rotateArr(arr, query[1] - 1, query[0] - 1, query[3] - 1, query[2] - 1)
}
return ans
}
/// 행렬 테두리를 회전하는 메서드
func rotateArr(_ arr: [[Int]], _ x1: Int, _ y1: Int, _ x2: Int, _ y2: Int) -> [[Int]] {
var rotateArr = arr
let first = rotateArr[y1 + 1][x1] // 시작점에 들어가야할 숫자 저장
var changeArr = [first]
// - 👈🏻
// | |
// -
for i in x1 + 1...x2 {
rotateArr[y1][i] = arr[y1][i - 1]
changeArr.append(arr[y1][i - 1])
}
// -
// | |👈🏻
// -
for i in y1 + 1...y2 {
rotateArr[i][x2] = arr[i - 1][x2]
changeArr.append(arr[i - 1][x2])
}
// -
// | |
// - 👈🏻
for i in stride(from: x2 - 1, to: x1 - 1, by: -1) {
rotateArr[y2][i] = arr[y2][i + 1]
changeArr.append(arr[y2][i + 1])
}
// -
// |👈🏻 |
// -
for i in stride(from: y2 - 1, to: y1, by: -1) {
rotateArr[i][x1] = arr[i + 1][x1]
changeArr.append(arr[i + 1][x1])
}
rotateArr[y1][x1] = first // 시작점에 들어가야할 숫자 할당
ans.append(changeArr.sorted().first!) // 이동한 숫자 중 최솟값 구하기
return rotateArr
}