반응형
문제
https://programmers.co.kr/learn/courses/30/lessons/60059
풀이
import Foundation
func solution(_ key:[[Int]], _ lock:[[Int]]) -> Bool {
var key = key
let n = lock.count
let m = key.count
// key를 돌리는 함수
func rotate() {
var newKey = [[Int]]()
for x in 0..<m {
var temp = [Int]()
for y in (0..<m).reversed() {
temp.append(key[y][x])
}
newKey.append(temp)
}
key = newKey
}
// 현재 key를 기준으로 test를 수행하는 함수
func test() -> Bool {
for py in 1-m..<n+1 {
for px in 1-m..<n+1 {
var mlock = lock
for y in 0..<m {
for x in 0..<m {
if py+y >= 0 && px+x >= 0 && py+y < n && px+x < n {
mlock[py+y][px+x] += key[y][x]
}
}
}
if check(mlock) { return true }
}
}
return false
}
// 현재 자물쇠값을 확인하는 함수
func check(_ lock: [[Int]]) -> Bool {
for y in 0..<lock.count {
for x in 0..<lock.count {
if lock[y][x] != 1 {
return false
}
}
}
return true
}
// 현재 상태에서 한번 테스트
if test() { return true }
// 돌려서 테스트 3번
for _ in 1...3 {
rotate()
if test() { return true }
}
return false
}
- 문제 자체의 난이도는 높지않지만 침착하게 푸는 것이 중요한 문제였다.
- 2차원 배열의 회전 및 좌표 위치의 비교를 잘 생각해야한다.
- 실제 Lock의 좌표를 0부터 N까지라고 생각하면, Key 행동반경은 -(M-1) ~ N+(M-1) 이다.
- 이를 고려해보면 Key의 기준점(Key의 0,0이 배치되는 위치)의 범위는 -(M-1) ~ N+1 이다.
- 이들을 비교해 Key의 좌표와 Lock의 좌표가 일치하는 구간에서는 값을 더하고 모든 좌표가 1인지 확인해줬다.
반응형
'💻 CS > 알고리즘 연습' 카테고리의 다른 글
[알고리즘 연습] 보석 쇼핑 (프로그래머스 lv3, 스위프트) (0) | 2022.05.04 |
---|---|
[알고리즘 연습] 경주로 건설 (프로그래머스 lv3, 스위프트) (0) | 2022.05.03 |
[알고리즘 연습] 표 편집 (프로그래머스 lv3, 스위프트) (0) | 2022.04.29 |
[알고리즘 연습] 전력망을 둘로 나누기 (프로그래머스 lv2, 스위프트) (0) | 2022.04.27 |
[알고리즘 연습] 방금그곡 (프로그래머스 lv2, 스위프트) (0) | 2022.04.23 |