Programming/Algorithm & Data Structure
[Swift] 프로그래머스 2021 Dev-Matching: 웹 백엔드 개발자(상반기) > 행렬 테두리 회전하기
guswlsdk
2022. 5. 19. 13:34
반응형
코딩테스트 연습 - 행렬 테두리 회전하기
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
문제풀이
행렬 문제로 2차원 배열의 인덱스를 잘 고려하며 해결해야한다.
딱히 문제 풀이라고 할 것이 없고, 대신 고려할 점이 몇 가지 있다.
내가 문제를 풀면서 문제를 해결한 방법이다.
1. row <= 100, column <= 100이기 때문에 최댓값이 10000이라는 점이다.
min을 처음에 10000 이하의 수로 정의하여 테스트케이스를 통과하지 못 하였다.
2. 테스트 케이스에서 row, column이 같거나 큰 경우로 예를 들었는데 경우의 수는 세 가지이다.
- row > column
- row = column
- row < column
이 세 가지의 경우를 만족하도록 유의하자.
코드
func solution(_ rows:Int, _ columns:Int, _ queries:[[Int]]) -> [Int] {
var map = Array(repeating: Array(repeating: 0, count: columns+1), count: rows+1)
var result = [Int]()
for i in 1...rows{
for j in 1...columns{
map[i][j] = ((i-1) * columns + j)
}
}
for query in queries{
let x1 = query[0]
let y1 = query[1]
let x2 = query[2]
let y2 = query[3]
var i = x1
var j = y1
var min = 10000001
var preVal = map[i][j]
var plusFlag = true
while true{
let curVal = map[i][j]
if min > curVal {
min = curVal
}
map[i][j] = preVal
preVal = curVal
if plusFlag {
if j < y2{
j += 1
}else if i < x2{
i += 1
}
}else{
if y1 < j {
j -= 1
}else if x1 < i{
i -= 1
}
}
if i == x2, j == y2 {
plusFlag = false
}
if plusFlag == false, i == x1, j == y1{
map[x1][y1] = preVal
break
}
}
result.append(min)
}
return result
}
반응형