[회고] 신입 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인지 확인해줬다.
반응형