Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
hwangJi-dev opened this issue Feb 10, 2023 · 0 comments
Closed

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

hwangJi-dev opened this issue Feb 10, 2023 · 0 comments

Comments

@hwangJi-dev
Copy link
Owner

hwangJi-dev commented Feb 10, 2023

💬 문제

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
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant