[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

💻 CS/알고리즘 연습

[알고리즘 연습] 자물쇠와 열쇠 (프로그래머스 lv3, 스위프트)

inu 2022. 5. 1. 14:10

문제

https://programmers.co.kr/learn/courses/30/lessons/60059

 

코딩테스트 연습 - 자물쇠와 열쇠

[[0, 0, 0], [1, 0, 0], [0, 1, 1]] [[1, 1, 1], [1, 1, 0], [1, 0, 1]] true

programmers.co.kr

풀이

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인지 확인해줬다.