본문 바로가기
#알고리즘 [Algorithm]/Problem

[프로그래머스 - 구현] 행렬 테두리 회전하기

by cy_mos 2021. 11. 18.
반응형
카테고리 (Category) 작성 날짜 (Write Date) 최근 수정 날자 (Recent Write Date) 작성자 (Writer)
Algorithm 2021년 11월 18일 22시 57분 2021년 11월 18일 22시 57분 Dev.Yang

 

[제한사항]

  • rows는 2 이상 100 이하인 자연수입니다.
  • columns는 2 이상 100 이하인 자연수입니다.
  • 처음에 행렬에는 가로 방향으로 숫자가 1부터 하나씩 증가하면서 적혀있습니다.
    • 즉, 아무 회전도 하지 않았을 때, i 행 j 열에 있는 숫자는 ((i-1) x columns + j)입니다.
  • queries의 행의 개수(회전의 개수)는 1 이상 10,000 이하입니다.
  • queries의 각 행은 4개의 정수 [x1, y1, x2, y2]입니다.
    • x1 행 y1 열부터 x2 행 y2 열까지 영역의 테두리를 시계방향으로 회전한다는 뜻입니다.
    • 1 ≤ x1 < x2 ≤ rows, 1 ≤ y1 < y2 ≤ columns입니다.
    • 모든 회전은 순서대로 이루어집니다.
    • 예를 들어, 두 번째 회전에 대한 답은 첫 번째 회전을 실행한 다음, 그 상태에서 두 번째 회전을 실행했을 때 이동한 숫자 중 최솟값을 구하면 됩니다.

📄 Swift Source Code

더보기
import Foundation

internal typealias Location = (x: Int, y: Int)

internal var previous = Int.zero
internal var materix: [[Int]] = []

internal enum RotateType {
    case right, down, left, top
}

/**
    - NOTE:
        - x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.
        - 모든 회전은 순서대로 이루어집니다.
*/
func solution(_ rows: Int, _ columns: Int, _ queries: [[Int]]) -> [Int] {
    
    var result: [Int] = .init()
    
    materix = Array(repeating: Array(repeating: Int.zero, count: columns), count: rows)
    
    // 입력받은 행렬의 크기에 대해서 숫자를 채워넣습니다.
    var count = Int.zero
    for outline in materix.indices {
        materix[outline].indices.forEach {
            count = count + 1
            materix[outline][$0] = count
        }
    }

    for query in queries {
        var minValue = Int.max
        let first = Location(query[0] - 1, query[1] - 1)
        let second = Location(query[2] - 1, query[3] - 1)
        
        rotate(startIndex: first, end: second.y, value: +1, type: .right, minValue: &minValue)
        rotate(startIndex: Location(first.x, second.y), end: second.x, value: +1, type: .down, minValue: &minValue)
        rotate(startIndex: second, end: first.y + 1, value: -1, type: .left, minValue: &minValue)
        rotate(startIndex: Location(second.x, first.y), end: first.x + 1, value: -1, type: .top, minValue: &minValue)
        previous = Int.zero
        
        result.append(minValue)
    }
    
    // MARK: 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return
    return result
}

func rotate(startIndex: Location, end: Int, value: Int, type: RotateType, minValue: inout Int) {
    
    var origin = previous
    
    switch type {
    case .right:
        for index in startIndex.y..<end {
            let moveItem = origin > Int.zero ? origin : materix[startIndex.x][index]
            origin = materix[startIndex.x][index + value]
            materix[startIndex.x][index + value] = moveItem
            minValue = min(minValue, moveItem)
        }
        previous = origin
    case .down:
        for index in startIndex.x..<end {
            let moveItem = origin
            origin = materix[index + value][startIndex.y]
            materix[index + value][startIndex.y] = moveItem
            minValue = min(minValue, moveItem)
        }
        previous = origin
    case .left:
        for index in stride(from: startIndex.y, through: end, by: value) {
            let moveItem = origin
            origin = materix[startIndex.x][index + value]
            materix[startIndex.x][index + value] = moveItem
            minValue = min(minValue, moveItem)
        }
        previous = origin
    case .top:
        for index in stride(from: startIndex.x, through: end, by: value) {
            let moveItem = origin
            origin = materix[index + value][startIndex.y]
            materix[index + value][startIndex.y] = moveItem
            minValue = min(minValue, moveItem)
        }
        previous = origin
    }
}

🚀 REFERENCE

 

코딩테스트 연습 - 행렬 테두리 회전하기

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

 

GitHub - ChangYeop-Yang/Study-Algorithm: 수학과 컴퓨터 과학, 언어학 또는 관련 분야에서 어떠한 문제를

수학과 컴퓨터 과학, 언어학 또는 관련 분야에서 어떠한 문제를 해결하기 위해 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 것을 말한다. 알고리즘은 연산, 데이터 진행 또는 자동화된

github.com

 

반응형

댓글