Swift랑 친해지기/programmers 풀기

[프로그래머스] 2021 Dev-Matching: 웹 백엔드 개발자(상반기)행렬 테두리 회전하기 (Swift)

데브킹덕 2023. 6. 1. 13:06

https://school.programmers.co.kr/learn/courses/30/lessons/77485

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

import Foundation

func solution(_ rows:Int, _ columns:Int, _ queries:[[Int]]) -> [Int] {
    
     if queries == [[1,1,rows,columns]]{
        return [1]
    } // 가장 테두리 수만 회전할 경우
    
    var board: [[Int]] = [[Int]]() //행렬 생성
    let max = rows * columns //총 개수
    var array = [Int]()
    
    for i in 1...max{
        array.append(i)
        if array.count == columns{
            board.append(array)
            array.removeAll()
        }
    }
    //행렬 생성
    
    var rotation = [Int]() //회전하는 수를 담을 배열
    var result = [Int]() //반환배열

    
    for coordinate in queries{
        var minNum = 10001 // 회전하는 수 중에 가장 작은 수 
        
        for i in coordinate[1]-1...coordinate[3]-1{
            rotation.append(board[coordinate[0]-1][i])
            if board[coordinate[0]-1][i] < minNum{
                minNum = board[coordinate[0]-1][i]
            }
        }
//        x1y1 -> x1y2

        for i in coordinate[1]...coordinate[3]-1{
            board[coordinate[0]-1][i] = rotation[0]
            rotation.remove(at: 0)
        }


        for i in coordinate[0]...coordinate[2]-1{
            rotation.append(board[i][coordinate[3]-1])
            if board[i][coordinate[3]-1] < minNum{
                minNum = board[i][coordinate[3]-1]
            }
        }
//        x1y2 ->x2y2

        for i in coordinate[0]...coordinate[2]-1{
            board[i][coordinate[3]-1] = rotation[0]
            rotation.remove(at: 0)
        }
       
        for i in stride(from: coordinate[3]-2, through: coordinate[1]-1, by: -1){
            rotation.append(board[coordinate[2]-1][i])
            if board[coordinate[2]-1][i] < minNum{
                minNum = board[coordinate[2]-1][i]
            }
        }
        //x2y2->x2y1

        for i in stride(from: coordinate[3]-2, through: coordinate[1]-1, by: -1){
            board[coordinate[2]-1][i] = rotation[0]
            rotation.remove(at: 0)
        }

        for i in stride(from: coordinate[2]-2, through: coordinate[0], by: -1){
            rotation.append(board[i][coordinate[1]-1])
            if board[i][coordinate[1]-1] < minNum{
                minNum = board[i][coordinate[1]-1]
            }
        }
        //x2y1->x1y1

        for i in stride(from: coordinate[2]-2, through: coordinate[0]-1, by: -1){
            board[i][coordinate[1]-1] = rotation[0]
            rotation.remove(at: 0)
        }
        
        result.append(minNum)
    }

    return result
}