프로그래머스 - 행렬 테두리 회전하기(Lv. 2)

OQ·2022년 3월 7일
0

프로그래머스

목록 보기
12/33

문제 링크

풀이

import Foundation

func solution(_ rows:Int, _ columns:Int, _ queries:[[Int]]) -> [Int] {
    var result: [Int] = []
    var rect = makeRect(rows, columns)
    
    queries.forEach {
        rotate($0, &rect, &result)
    }
    
    return result
}

// 행렬 만들기
func makeRect(_ rows:Int, _ columns:Int) -> [[Int]] {
    var rect: [[Int]] = []
    var index = 1
    for i in 0..<rows {
        rect.append([Int]())
        for j in 0..<columns {
            rect[i].append(index)
            index += 1
        }
    }
    
    return rect
}

// query에 맞춰 회전시키고 이동한 숫자 중 최소값 구하기
func rotate(_ query: [Int], _ rect: inout [[Int]], _ result: inout [Int]) {
    var newRect = rect
    let startX = query[1] - 1   // x축 시작점
    let startY = query[0] - 1
    let endX = query[3] - 1     // x축 끝점
    let endY = query[2] - 1
    
    var changes: [Int] = [] //  변경된 숫자들 목록
    
    for i in startY...endY {
        for j in startX...endX {
            // print("i: \(i) / j: \(j)")
            if i == startY {    // 사각형의 위쪽 면
                if j == startX {    // x축 맨 왼쪽 모서리일 경우
                    newRect[i][j] = rect[i + 1][j]
                } else {    // x축 중간
                    newRect[i][j] = rect[i][j - 1]
                }
                
                changes.append(newRect[i][j])
            } else if j == endX {   // 사각형의 오른쪽 면
                newRect[i][j] = rect[i - 1][j]
                changes.append(newRect[i][j])
            } else if i == endY {   // 사각형의 아래쪽 면
                newRect[i][j] = rect[i][j + 1]
                changes.append(newRect[i][j])
            } else if j == startX {   // 사각형의 왼쪽 면
                newRect[i][j] = rect[i + 1][j]
                changes.append(newRect[i][j])
            } else {    // 사각형의 가운데 부분
                continue
            }
        }
    } 
    
    rect = newRect
    // print(changes)
    result.append(changes.min()!)
}

후기

머리속에 행렬을 이미지하고 어떻게 처리할지 상상하는 능력이 필요한 문제.
구상하여 문제를 풀던 도중 2중 반복문이 들어가서 복잡도에서 실패날까 조마조마했지만 다행히 시간 복잡도를 요구하는 문제는 아니었다. (복잡도 최적화하라고해도 못할거 같긴하다ㅋㅋ)

profile
덕업일치 iOS 개발자

0개의 댓글