import Foundation
func solution(_ rows:Int, _ columns:Int, _ queries:[[Int]]) -> [Int] {
var result: [Int] = []
var rect = makeRect(rows, columns)
queries.forEach {
rotate($0, &rect, &result)
}
return result
}
// 행렬 만들기
func makeRect(_ rows:Int, _ columns:Int) -> [[Int]] {
var rect: [[Int]] = []
var index = 1
for i in 0..<rows {
rect.append([Int]())
for j in 0..<columns {
rect[i].append(index)
index += 1
}
}
return rect
}
// query에 맞춰 회전시키고 이동한 숫자 중 최소값 구하기
func rotate(_ query: [Int], _ rect: inout [[Int]], _ result: inout [Int]) {
var newRect = rect
let startX = query[1] - 1 // x축 시작점
let startY = query[0] - 1
let endX = query[3] - 1 // x축 끝점
let endY = query[2] - 1
var changes: [Int] = [] // 변경된 숫자들 목록
for i in startY...endY {
for j in startX...endX {
// print("i: \(i) / j: \(j)")
if i == startY { // 사각형의 위쪽 면
if j == startX { // x축 맨 왼쪽 모서리일 경우
newRect[i][j] = rect[i + 1][j]
} else { // x축 중간
newRect[i][j] = rect[i][j - 1]
}
changes.append(newRect[i][j])
} else if j == endX { // 사각형의 오른쪽 면
newRect[i][j] = rect[i - 1][j]
changes.append(newRect[i][j])
} else if i == endY { // 사각형의 아래쪽 면
newRect[i][j] = rect[i][j + 1]
changes.append(newRect[i][j])
} else if j == startX { // 사각형의 왼쪽 면
newRect[i][j] = rect[i + 1][j]
changes.append(newRect[i][j])
} else { // 사각형의 가운데 부분
continue
}
}
}
rect = newRect
// print(changes)
result.append(changes.min()!)
}
머리속에 행렬을 이미지하고 어떻게 처리할지 상상하는 능력이 필요한 문제.
구상하여 문제를 풀던 도중 2중 반복문이 들어가서 복잡도에서 실패날까 조마조마했지만 다행히 시간 복잡도를 요구하는 문제는 아니었다. (복잡도 최적화하라고해도 못할거 같긴하다ㅋㅋ)