Skip to content

[Algorithm] 행렬 테두리 회전하기 #107

@hwangJi-dev

Description

@hwangJi-dev

💬 문제

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


💬 Idea

  1. rows, columns 크기의 행렬을 생성한다

  2. 쿼리를 돌면서 행렬 테두리를 회전시킨다

    [ 행렬 테두리 회전 로직 ]

    • ㅡ : 시작 y 고정 / 시작 x+1 부터 끝 x까지 돌면서 좌표의 이전 좌표값으로 바꿔준다.
    • | : 끝 x 고정 / 시작 y+1 부터 끝 y까지 돌면서 좌표의 이전 좌표값으로 바꿔준다.
    • ㅡ : 끝 y 고정 / 끝 x-1 부터 시작 x까지 돌면서 좌표의 이전 좌표값으로 바꿔준다.
    • | : 시작 x 고정 / 끝 y-1 부터 시작 y까지 돌면서 좌표의 이전 좌표값으로 바꿔준다.
    • 시작좌표값을 처음에 저장한 시작점에 들어가야할 숫자로 바꿔준다.

💬 풀이

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
}

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions