반응형
카테고리 (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
반응형
'# 사용하지 않는 게시글 > 알고리즘 문제' 카테고리의 다른 글
[프로그래머스 - 구현] 신고 결과 받기 (0) | 2022.02.08 |
---|---|
[프로그래머스 - 구현] 문자열 압축 (0) | 2022.01.24 |
[프로그래머스 - 구현] 신규 아이디 추천 (0) | 2021.10.06 |
[프로그래머스 - 정렬] 복서 정렬하기 (0) | 2021.09.27 |
[프로그래머스 - 자료구조] 직업군 추천하기 (0) | 2021.09.16 |
댓글