2021. 6. 3. 18:45γπ§π»π» iOS κ°λ°/Swift - Algorithm - Solutions
π΅π» λ¬Έμ ν΄μ
κ³ κ³ νμμΈ "νλΈ"λ κ³ λ μ μ μ§μμ 보물과 μ μ μ΄ κ°λν κ²μΌλ‘ μΆμ λλ λΉλ°μ λ¬Έμ λ°κ²¬νμμ΅λλ€. μ 겨μλ μλ¬Όμ λ 격μ ν μΉΈμ ν¬κΈ°κ° 1 x 1μΈ N x N ν¬κΈ°μ μ μ¬κ° 격μ ννμ΄κ³ νΉμ΄ν λͺ¨μμ μ΄μ λ M x M ν¬κΈ°μΈ μ μ¬κ° 격μ ννλ‘ λμ΄ μμ΅λλ€.
μλ¬Όμ μλ νμ΄ νμ¬ μκ³ μ΄μ λν νκ³Ό λκΈ° λΆλΆμ΄ μμ΅λλ€. μ΄μ λ νμ κ³Ό μ΄λμ΄ κ°λ₯νλ©° μ΄μ μ λκΈ° λΆλΆμ μλ¬Όμ μ ν λΆλΆμ λ± λ§κ² μ±μ°λ©΄ μλ¬Όμ κ° μ΄λ¦¬κ² λλ ꡬ쑰μ λλ€. μλ¬Όμ μμμ λ²μ΄λ λΆλΆμ μλ μ΄μ μ νκ³Ό λκΈ°λ μλ¬Όμ λ₯Ό μ¬λ λ° μν₯μ μ£Όμ§ μμ§λ§, μλ¬Όμ μμ λ΄μμλ μ΄μ μ λκΈ° λΆλΆκ³Ό μλ¬Όμ μ ν λΆλΆμ΄ μ νν μΌμΉν΄μΌ νλ©° μ΄μ μ λκΈ°μ μλ¬Όμ μ λκΈ°κ° λ§λμλ μλ©λλ€. λν μλ¬Όμ μ λͺ¨λ νμ μ±μ λΉμ΄μλ κ³³μ΄ μμ΄μΌ μλ¬Όμ λ₯Ό μ΄ μ μμ΅λλ€.
- keyλ M x M(3 ≤ M ≤ 20, Mμ μμ°μ) ν¬κΈ° 2μ°¨μ λ°°μ΄μ λλ€.
- lockμ N x N(3 ≤ N ≤ 20, Nμ μμ°μ)ν¬κΈ° 2μ°¨μ λ°°μ΄μ λλ€.
- Mμ νμ N μ΄νμ λλ€.
- keyμ lockμ μμλ 0 λλ 1λ‘ μ΄λ£¨μ΄μ Έ μμ΅λλ€.
- 0μ ν λΆλΆ, 1μ λκΈ° λΆλΆμ λνλ λλ€.
π€ νμ΄ κ³Όμ
λ¨Όμ , λ¬Έμ λ₯Ό λ³΄κ³ μ μ¬κ° νλ ¬ ννλ‘ μ£Όμ΄μ§ μ΄μ λ₯Ό μκ³ λ°©ν₯μΌλ‘ 90λ νμ μν€λ ν¨μκ° μ μΌ λ¨Όμ νμνκ² κ΅¬λ μΆμμ΅λλ€.
func rotateKey90DegreesClockwise(_ key: [[Int]]) -> [[Int]] {
var rotatedKey = [[Int]](repeating: [Int](repeating: 0, count: M), count: M)
for col in 0..<M {
for row in (0..<M).reversed() {
rotatedKey[col][M - 1 - row] = key[row][col]
}
}
return rotatedKey
}
μ λ λ€μκ³Ό κ°μ΄ μμ±νλλ°, νμ μλ λ°μ΄ν°λ€μ΄ νμ λ νλ ¬μμλ μ΄ λ°μ΄ν°κ° λλ―λ‘ 3 X 3 μ λμ μμ νλ ¬μ 보면μ κ·Έμ λ§μΆμ΄ λ°λ³΅λ¬Έμ μμ±ν΄λ³΄μμ΅λλ€. ꡬκΈμ νλ ¬ νμ μ λν μ€λͺ μ΄ μμΈνκ² λμμμΌλ―λ‘ μ΄ λΆλΆμ 건λλ°μ΄λ λκ² μ£ ? π₯Ί
μ μ΄μ , μ΄μ λ₯Ό νμ μν¬ μ μμΌλ μλ¬Όμ μ λ§μΆμ΄ 보μμΌκ² μ΅λλ€. νμ μν¨ μ΄μ νλ ¬μ κ°λ₯ν λͺ¨λ μμΉλ§λ€ μλ¬Όμ νλ ¬κ³Ό λ ν΄μ£Όμμ λ μλ¬Όμ νλ ¬μ κ°λ€μ΄ λͺ¨λ 1μ΄ λλ©΄ μλ¬Όμ κ° μ΄λ¦°λ€κ³ νλ¨ν μ μμ΅λλ€.
λ§μ½ μλ¬Όμ νλ ¬μ κ°μ€μ 0μ΄ μ‘΄μ¬νλ€λ©΄, μ±μμ§μ§ μμ νμ΄ μλ€λ κ²μ΄κ³ 2κ° μ‘΄μ¬νλ€λ©΄ μλ¬Όμ μ λκΈ°μ μ΄μ μ λκΈ°κ° λ§λ¬λ€κ³ νλ¨νκ³ μ΄ κ²½μ°μλ false μ²λ¦¬λ₯Ό ν΄μ£Όμμ΅λλ€.
μ€λͺ μ λκΈ° μν΄ λ¬Έμ μμ μμλ‘ μ€ 3 X 3 μλ¬Όμ μ μ΄μ λ₯Ό λ°νμΌλ‘ νλ ¬ νλ₯Ό μμ±ν΄λ΄€μ΅λλ€.π μ΄ νλ νμ₯λ μλ¬Όμ μμμ ννν κ²μΈλ°μ, λ¬Έμ μμ μ΄μ μ ν¬κΈ°μΈ Nμ νμ Mμ΄νλΌκ³ νκΈ° λλ¬Έμ μ΄λ λ°©ν₯μΌλ‘ μ΄μ λ₯Ό κ²ΉμΉλ 3 * N X 3 * N νλ ¬ μμμ κ²Ήμ³μ§κ² λλ€κ³ νλ¨ν΄μ μ΄λ κ² ν΄μ£Όμμ΅λλ€. λ Έλμμ μ μ νλ ¬μ μΈλ±μ€μ λλ€!
μλ μλ¬Όμ νλ ¬μ νμ₯λ νλ ¬ μμμ [N..<2 * N][N..<2 * N]μ μμΉνκ³ μλ¬Όμ νλ ¬μμκ³Ό μ΄μ νλ ¬ μμμ΄ νλ μ΄μμ κ²Ήμ³μΌ νκΈ° λλ¬Έμ (κ²ΉμΉμ§ μμΌλ©΄ μλ¬Όμ μ μ΄μ λ₯Ό μ λΌμ°λ κ²©μ΄ λ©λλ€..) μ΄μ νλ ¬μ΄ μμΉν μ μλ μμμ λΉ¨κ°μμΌλ‘ ν λ리 μ³λ λΆλΆμ΄ λ©λλ€.
λ³΄ν΅ μ΄μ€ forλ¬ΈμΌλ‘ νλ ¬μ νμν λ μ’μλ¨λΆν° νμμ νκΈ° λλ¬Έμ λΉ¨κ°μ μμμ μ΄μ νλ ¬μΈ M X Mκ³Ό λ§€μΉ μμΌ νμνλ €λ©΄ κ·Έ νμμ μμνλ μ’νκ° [N - M + 1 ..< 2 * N] [N - M + 1 ..< 2 * N] μ μμΉνκ² λ©λλ€.
μ΄λ₯Ό νλ‘ νννλ©΄ λ€μκ³Ό κ°μ΅λλ€.
μ΄λ κ² νμ μ§μ μ νμ νκ³ λμ μ λ ₯λ°μ μ΄μ νλ ¬μ νμ μν€λ©° ν΄λΉ μμμ νμν΄λ³΄κ³ μλ¬Όμ κ° μ΄λ¦¬λ μΌμ΄μ€λ₯Ό νλ¨ν΄μ£Όλ©΄ λ κ² κ°μ΅λλ€. νλ‘ λ§λ€κΈ΄ νλλ°.. μ΄ν΄μ λμμ΄ λμμΌλ©΄ ν©λλ€.π νΉμλ λ¬Έμ μ€λͺ μ μ€λ₯κ° μμΌλ©΄ λκΈλ‘ μλ €μ£ΌμΈμ!
π¦ λ¬Έμ νμ΄ & μ½λ
import Foundation
func solution(_ key:[[Int]], _ lock:[[Int]]) -> Bool {
let M = key.count
let N = lock.count
// 3 * N X 3 * N μΌλ‘ νμ₯μν¨ μλ¬Όμ νλ ¬
var extendedLock = [[Int]](repeating: [Int](repeating: 0, count: 3 * N), count: 3 * N)
// νμ₯λ νλ ¬μμ μλμ μλ¬Όμ νλ ¬μ΄ μμΉνλ λ²μ
let extendedRange = N..<2 * N
// 90λ μκ³λ°©ν₯ νμ
func rotateKey90DegreesClockwise(_ key: [[Int]]) -> [[Int]] {
var rotatedKey = [[Int]](repeating: [Int](repeating: 0, count: M), count: M)
for col in 0..<M {
for row in (0..<M).reversed() {
rotatedKey[col][M - 1 - row] = key[row][col]
}
}
return rotatedKey
}
// νμ₯λ νλ ¬μμ μλ¬Όμ μμΉλ₯Ό νμνλ©° μ΄λ¦¬λμ§ νλ¨
func canOpen(_ lock: [[Int]]) -> Bool {
for i in extendedRange {
for j in extendedRange {
// 0 μ΄ μ‘΄μ¬νλ©΄ μ±μμ§μ§ μμ ν, 2μ΄λ©΄ λκΈ°λΌλ¦¬ λ§λ κ²½μ° false 리ν΄
if lock[i][j] != 1 {
return false
}
}
}
return true
}
// μ
λ ₯λ°μμ λ, μλ¬Όμ κ° λͺ¨λ 1μΈ κ²½μ° μ΄λ €μμΌλ―λ‘ true 리ν΄
if (lock.filter{$0.contains(0)}).isEmpty {
return true
}
// νμ₯
for i in 0..<N {
for j in 0..<N {
extendedLock[i + N][j + N] = lock[i][j]
}
}
var tempKey = key
var tempExtendedLock = extendedLock
for _ in 0..<4 {
for i in (N - M + 1)..<2 * N {
for j in (N - M + 1)..<2 * N {
tempExtendedLock = extendedLock
for row in 0..<M {
for col in 0..<M {
tempExtendedLock[i + row][j + col] += tempKey[row][col]
}
}
if canOpen(tempExtendedLock) {
return true
}
}
}
// ν€λ₯Ό νμ μν€λ©΄μ μ΄λ¦¬λμ§ μ²΄ν¬
tempKey = rotateKey90DegreesClockwise(tempKey)
}
return false
}
π€·π»βοΈ λ μκ°ν΄λ³΄κΈ°
μ κ²½μ°λ canOpenμ΄λΌλ ν¨μλ₯Ό λ°λ‘ μμ±νμ¬ μ΄μ€ for λ¬Έμ ν΅ν΄ μΌμΌμ΄ μλ¬Όμ μμμ νμΈν΄μ£Όμμ§λ§, νΈμΆ μ μ κ°μ λνλ κ³Όμ μμ 1μ΄ μλ κ°μ΄ λμ€λ©΄ λ°λ‘ λ°λ³΅λ¬Έμ breakνλ μ²λ¦¬λ₯Ό νλ©΄ μ’ λ ν¨μ¨μ μΈ νμ΄κ° λ λ― μΆμ΅λλ€. μ λ μ’ λ λΉ λ₯΄κ² ν μμλ λ°©λ²μ 곡λΆν΄μΌκ² λ€μ.π₯²
- λ¬Έμ λ§ν¬ : https://programmers.co.kr/learn/courses/30/lessons/60059
'π§π»βπ» iOS κ°λ° > Swift - Algorithm - Solutions' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift - νλ‘κ·Έλλ¨Έμ€] λΆλ μ¬μ©μ (0) | 2021.06.09 |
---|---|
[Swift - νλ‘κ·Έλλ¨Έμ€] μ¬ μ°κ²°νκΈ° (0) | 2021.06.07 |
[Swift - νλ‘κ·Έλλ¨Έμ€] λ€λ¨κ³ μΉ«μ ν맀 (0) | 2021.06.02 |
[Swift - νλ‘κ·Έλλ¨Έμ€] ν©μΉ νμ μκΈ (0) | 2021.06.01 |
[Swift - νλ‘κ·Έλλ¨Έμ€] [μΉ΄μΉ΄μ€ μΈν΄] κ²½μ£Όλ‘ κ±΄μ€ (0) | 2021.05.31 |