반응형
안녕하세요. 개발 중인 정주입니다.
오늘은 "프로그래머스(Lv.2) - 행렬 테두리 회전하기" 문제를 풀었습니다.
Github
문제 링크
풀이
행렬 테두리 회전하기 문제는 구현 문제입니다.
이번에도 뭔가 함정이 있지 않을까 고심을 했는데 결국에는 단순 구현 문제였습니다.
제가 푼 로직 순서는 아래와 같습니다.
1. 회전하는 좌표를 구한다.
2. 좌표에 맞는 숫자를 배열에 넣는다. 이때 숫자의 순서는 회전하는 순서와 동일해야 한다.
3. 좌표에 이전 좌표 숫자를 대입한다.
로직 자체는 간단하죠?
저는 좌표 구하는 과정에서 행렬과 좌표가 헷갈려 시간을 많이 썼던 것 같습니다.
감사합니다!
전체 코드
import Foundation
func createCoordinates(_ rows: Int, _ columns: Int, _ query: [Int]) -> [(x: Int, y: Int)] {
let row1 = query[0], col1 = query[1], row2 = query[2], col2 = query[3]
var coordinates: [(Int, Int)] = []
coordinates.append(contentsOf: (col1...col2).map { ($0-1, row1-1) })
coordinates.append(contentsOf: ((row1+1)...row2).map { (col2-1, $0-1) })
coordinates.append(contentsOf: stride(from: col2-1, to: col1-1, by: -1).map { ($0-1, row2-1) })
coordinates.append(contentsOf: stride(from: row2-1, to: row1, by: -1).map { (col1-1, $0-1) })
return coordinates
}
func solution(_ rows:Int, _ columns:Int, _ queries:[[Int]]) -> [Int] {
var matrix: [[Int]] = []
for row in 0..<rows { //행
matrix.append([])
for column in 0..<columns { //열
let num = row * columns + column
matrix[row].append(num+1)
}
}
var results: [Int] = []
queries.forEach {
let coordinates = createCoordinates(rows, columns, $0)
var numbers: [Int] = []
coordinates.forEach {
numbers.append(matrix[$0.y][$0.x])
}
results.append(numbers.min()!)
for i in 1..<coordinates.count {
matrix[coordinates[i].y][coordinates[i].x] = numbers[i-1]
}
matrix[coordinates[0].y][coordinates[0].x] = numbers.last!
}
return results
}
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.
반응형