2021. 5. 29. 20:11γπ§π»π» iOS κ°λ°/Swift - Algorithm - Solutions
π΅π» λ¬Έμ ν΄μ
μΉ΄μΉ΄μ€μ νλ°κΈ° κ²½λ ₯ κ°λ°μ 곡κ°μ±μ©μμ μ§μμλ€μ μ§μμμ μ½λ©ν μ€νΈ μ μλ₯Ό μ΄μ©νμ¬ μ±μ©μ μ°Έμ¬ν κ°λ°νλ€μ λ¬Έμ μ¬νμ λ§λ μ§μμλ€μ μλ₯Ό μ 곡νλ €κ³ ν©λλ€. μ§μμ νλͺ©μ μ΄ 4κ°μ§, κ°λ°μΈμ΄, μ§μ μ§κ΅°, μ§μ κ²½λ ₯, μ νΈνλ μμΈνΈλλ‘ κ΅¬μ±λμ΄μμ΅λλ€.
λ°λΌμ μ§μμμ 4κ°μ§ νλͺ©, μ½λ©ν μ€νΈ μ μ 1κ°μ§, μ΄ 5κ°μ§μ νλͺ©μ μλ£κ΅¬μ‘°μ μ μ₯νκ³ λ¬Έμ μ¬νλ€μ νμνλ©° κ°κ° κΈ°μ€μ μΆ©μ‘±νλ μ§μμλ€μ μλ₯Ό ꡬνλ©΄ λ κ² κ°μ΅λλ€.
κ·Έλ κ² νκΈ°μν΄ Keyλ μ§μμκ° μΆ©μ‘±νλ 쑰건μ μλ―Ένλ String, Valueλ ν΄λΉ 쑰건μ λ§μ‘±νλ μ§μμλ€μ μ μ λ°°μ΄ [Int] ννμ λμ λ리μ μ§μμλ€μ μ 보λ₯Ό μ μ₯ν΄λ³΄κ² μ΅λλ€.
var dic: [String : [Int]] = [:]
- info : "java backend junior pizza 150"
- query : "java and backend and junior and pizza 150"
λμ λ리μ μ μ₯νκΈ° μ μ, λ¨Όμ μ λ ₯μ μ΄ν΄λ³΄λ©΄ μ£Όμ΄μ§λ μ§μμλ€μ μ 보λ 곡백 (" ")μΌλ‘ ꡬλΆλμ΄μκ³ λ°λ©΄μ κ°λ°νλ€μ λ¬Έμμ¬νμ 곡백과 (" "), ("and")λ‘ κ΅¬λΆλμ΄μμ΅λλ€. λ¨Όμ μ΄λ₯Ό λμΌν ννλ‘ λ§λ€μ΄ μ£Όμ΄μΌ λΉκ΅λ₯Ό ν μ μκ² λκ² μ£ ?
for applicant in info {
// applicant -> "java backend junior pizza 150"
var components = applicant.components(separatedBy: " ")
// components -> ["java", "backend", "junior", "pizza", "150"]
let score = Int(components[4])!
}
for q in query {
// q -> "java and backend and junior and pizza and 150"
var components = q.components(separatedBy: " ").filter{$0 != "and"}
// components -> ["java", "backend", "junior", "pizza", "150"]
let score = Int(components[4])!
}
μμ£Ό μ¬μ©νλ components λ©μλλ₯Ό μ΄μ©νμ¬ κ³΅λ°±μ κΈ°μ€μΌλ‘ λλ [String] λ°°μ΄λ‘ μ§μμμ μ 보λ₯Ό λλ μ μμ΅λλ€. κ·Έ ν μ½λ©ν μ€νΈμ μ μλ Int μμ±μλ₯Ό μ΄μ©νμ¬ λ°λ‘ μ²λ¦¬ν©λλ€. λ§μ°¬κ°μ§λ‘ queryλ μ²λ¦¬ν΄μ€ ν, filterλ₯Ό μ΄μ©νμ¬ "and"λ₯Ό κ±Έλ¬λ λλ€.
μ¬κΈ°μ λ¬Έμμ¬ν μμ "-" νλͺ© λλ¬Έμ 골μΉκ° μνμ§λλ€.
λ§μ½ μ§μμμ μ λ³΄κ° "java backend junior pizza 150" λ‘ μ£Όμ΄μ§λ©΄ μ μλ₯Ό μ μΈνκ³ μ§μμκ° μΆ©μ‘±νλ μ‘°κ±΄μ΄ μ΄ 16κ°μ§κ° λ©λλ€.
["java", "backend", "junior", "pizza"]
["java", "backend", "junior", "-"]
["java", "backend", "-", "pizza"]
["java", "backend", "-", "-"]
["java", "-", "junior", "pizza"]
["java", "-", "junior", "-"]
["java", "-", "-", "pizza"]
["java", "-", "-", "-"]
["-", "backend", "junior", "pizza"]
["-", "backend", "junior", "-"]
["-", "backend", "-", "pizza"]
["-", "backend", "-", "-"]
["-", "-", "junior", "pizza"]
["-", "-", "junior", "-"]
["-", "-", "-", "pizza"]
["-", "-", "-", "-"]
λ°λΌμ μ¬κ·ν¨μλ₯Ό μ΄μ©νμ¬ μ§μμκ° μΆ©μ‘±νλ 쑰건λ€μ λͺ¨λ μΌμ΄μ€λ€μ ꡬν΄μ£Όμ΄ λμ λ리μ μ μλ₯Ό μ μ₯ν΄ μ£Όκ² μ΅λλ€.
// arr: μ§μμλ€μ μ 보λ₯Ό λ΄μ λ°°μ΄
// curIdx: "-"λ‘ λ°κΏ μ μ₯ν νλͺ©μ μΈλ±μ€
// score: μ§μμμ μ μ
func combination(_ arr: [String], _ curIdx: Int, _ score: Int) {
if curIdx == arr.count {
let result = arr.joined()
// νλͺ©λ€μ νλμ λ¬Έμμ΄λ‘ ν©μ³μ λμ
λ리μ μ μλ₯Ό μ μ₯
if dic[result] != nil {
dic[result]!.append(score)
} else {
dic[result] = [score]
}
} else {
var temp = arr
combination(temp, curIdx + 1, score)
temp[curIdx] = "-"
combination(temp, curIdx + 1, score)
}
return
}
μ μ₯μ΄ λλλ©΄ μ΄ ν μ΄λΆ νμμ μν΄ λμ λ리μ [Int] λ°°μ΄μ μ€λ¦μ°¨μμΌλ‘ μ λ ¬ν΄μ€λλ€. μ΄μ 쿼리λ€μ νμνλ©° λμ λ리μ μ μ λ°°μ΄μ΄ μ‘΄μ¬νλ©΄ 쿼리μ μ μμ λΉκ΅νμ¬ κ·Έ κ°μλ₯Ό answerλ°°μ΄μ μΆκ°νκ³ μ‘΄μ¬νμ§ μμΌλ©΄ ν΄λΉ 쑰건μ λ§μ‘±νλ μ§μμκ° μμΌλ―λ‘ 0μ μΆκ°ν©λλ€.
μ΄λ λ¬Έμ μμλ μ§μμκ° μ΅λ 5λ§ λͺ μ΄κ³ μ μμ μ΅λκ°μ 10λ§ μ , 쿼리 λ°°μ΄μ μ΅λ ν¬κΈ°κ° 10λ§μ΄λΌκ³ ν©λλ€. μ§μμλ€μ μ μκ° λͺ¨λ λ€λ₯΄λ€κ³ κ°μ ν μ μμΌλ―λ‘ μ ν νμμΌλ‘λ μκ° μ΄κ³Όκ° λ μ μμ΅λλ€. μ΄λΆ νμμ μ΄μ©νμ¬, LowerBoundλ₯Ό κ΅¬ν΄ μꡬ μ μ μ΄μμ μ μλ€μ μΉ΄μ΄νΈν΄μ€λλ€.
π¦ λ¬Έμ νμ΄ & μ½λ
import Foundation
func solution(_ info:[String], _ query:[String]) -> [Int] {
var dic: [String : [Int]] = [:]
var answer = [Int]()
func combination(_ arr: [String], _ curIdx: Int, _ score: Int) {
if curIdx == arr.count {
let result = arr.joined()
if dic[result] != nil {
dic[result]!.append(score)
} else {
dic[result] = [score]
}
} else {
var temp = arr
combination(temp, curIdx + 1, score)
temp[curIdx] = "-"
combination(temp, curIdx + 1, score)
}
return
}
func lowerbound(_ arr: [Int], _ score: Int) -> Int {
var low = 0
var high = arr.count
while low < high {
let mid = (low + high) / 2
if score <= arr[mid] {
high = mid
} else {
low = mid + 1
}
}
// low = score μ΄μμ μ μκ° μ²μ λ±μ₯νλ μΈλ±μ€
return arr.count - low
}
for applicant in info {
var components = applicant.components(separatedBy: " ")
let score = Int(components[4])!
components.removeLast()
combination(components, 0, score)
}
// μ΄λΆνμμ μν΄ λ―Έλ¦¬ μ μλ°°μ΄μ μ λ ¬
for (query, scores) in dic {
let sortedScores = scores.sorted(by: <)
dic[query] = sortedScores
}
for q in query {
var components = q.components(separatedBy: " ").filter{$0 != "and"}
let score = Int(components[4])!
components.removeLast()
let key = components.joined()
// ν΄λΉ 쑰건μ μΆ©μ‘±νλ μ μκ° μλ€λ©΄ 0
if dic[key] == nil {
answer.append(0)
} else {
// ν΄λΉ 쑰건μ μΆ©μ‘±νλ μ μ λ°°μ΄μ΄ μ‘΄μ¬νλ©΄, 쿼리μ μꡬ μ μλ‘ μ΄λΆ νμ
answer.append(lowerbound(dic[key]!, score))
}
}
return answer
}
π€·π»βοΈ λ μκ°ν΄λ³΄κΈ°
μ²μ λ¬Έμ μ μ κ·Όν λλ λ¨μν 쿼리μ μ§μμλ€μ μ 보λ₯Ό λ€μ€ forλ¬Έμ ν΅ν΄ λΉκ΅ν΄μ£Όμμ΅λλ€. ν μ€νΈ μΌμ΄μ€λ λͺ¨λ ν΅κ³ΌνμΌλ ν¨μ¨μ± ν μ€νΈμμ μκ° μ΄κ³Όκ° λλκ΅°μ..
λ¬Έμ μ 쑰건μ μ°Ύμ보λ μ§μμλ€μ μ΅λ μκ° 5λ§, 쿼리 λ°°μ΄μ μ΅λ ν¬κΈ°κ° 10λ§μ΄λ λ¨μ κ³±λ§ ν΄λ΄λ 50μ΅μ΄ λμ΄κ°λλ€. μ΄λ²μλ νΌμ ν΄κ²°νμ§ λͺ»νκ³ λ€λ₯Έ λΆλ€μ νμ΄λ₯Ό μ°Έκ³ νμ¬ λ¬Έμ λ₯Ό λ€μ νμ΄λ³΄μμ΅λλ€.
ν¨μ¨μ± ν μ€νΈμμλ μκ°μ΄ κ½€ 걸리λ κ²μΌλ‘ 보μ μ λ ₯μΌλ‘ λ€μ΄μ¨ μ§μμ μ 보μ 쿼리λ₯Ό λλμ΄ μ μ₯ν λ filter {} λμ μ andκ° λ±μ₯νλ μΈλ±μ€λ μ ν΄μ Έ μμΌλ―λ‘ νΉμ μΈλ±μ€λ§μ λͺ¨μ "\(components [0])\(components [2])..."μ΄λ° μμΌλ‘ μ²λ¦¬νλ©΄ λ λΉ λ₯Έ μλλ‘ ν΅κ³Όν μ μμ κ² κ°μ΅λλ€.
ππ» μ°Έκ³
'π§π»βπ» iOS κ°λ° > Swift - Algorithm - Solutions' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift - νλ‘κ·Έλλ¨Έμ€] [μΉ΄μΉ΄μ€ μΈν΄] κ²½μ£Όλ‘ κ±΄μ€ (0) | 2021.05.31 |
---|---|
[Swift - νλ‘κ·Έλλ¨Έμ€] μ κ· μμ΄λ μΆμ² (0) | 2021.05.31 |
[Swift - νλ‘κ·Έλλ¨Έμ€] [3μ°¨] λ°©κΈκ·Έκ³‘ (0) | 2021.05.27 |
[Swift - νλ‘κ·Έλλ¨Έμ€] [3μ°¨] nμ§μ κ²μ (0) | 2021.05.27 |
[Swift - νλ‘κ·Έλλ¨Έμ€] [3μ°¨] νμΌλͺ μ λ ¬ (0) | 2021.05.25 |