본문으로 바로가기

문제: 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

 

import Foundation

func rotate(_ query: [Int], _ matrix: inout [[Int]]) -> Int {
    var tmp = 0
    var minValue = Int.max
    var xy: (x: Int, y: Int) = (query[0], query[1])
    let lengthOfX = query[2] - query[0]
    let lengthOfY = query[3] - query[1]
    
    // 왼 -> 오
    tmp = matrix[xy.x][xy.y]
    for _ in 0..<lengthOfY {
        xy = (xy.x, xy.y + 1)
        swap(&tmp, &matrix[xy.x][xy.y])
        minValue = min(minValue, matrix[xy.x][xy.y])
    }
    // 위 -> 아래
    for _ in 0..<lengthOfX {
        xy = (xy.x + 1, xy.y)
        swap(&tmp, &matrix[xy.x][xy.y])
        minValue = min(minValue, matrix[xy.x][xy.y])
    }
    // 오 -> 왼
    for _ in 0..<lengthOfY {
        xy = (xy.x, xy.y - 1)
        swap(&tmp, &matrix[xy.x][xy.y])
        minValue = min(minValue, matrix[xy.x][xy.y])
    }
    // 아래 -> 위
    for _ in 0..<lengthOfX {
        xy = (xy.x - 1, xy.y)
        swap(&tmp, &matrix[xy.x][xy.y])
        minValue = min(minValue, matrix[xy.x][xy.y])
    }
    
    return minValue
}

func solution(_ rows:Int, _ columns:Int, _ queries:[[Int]]) -> [Int] {
    
    var result = [Int]()
    var matrix = [[Int]]()
    var count = 1
    
    for _ in 0..<rows {
        var arr = [Int]()
        for _ in 0..<columns {
            arr.append(count)
            count += 1
        }
        matrix.append(arr)
    }
    
    for i in 0..<queries.count {
        let query = queries[i].map { $0 - 1 }
        result.append(rotate(query, &matrix))
    }
    
    return result
}