[Swift] 2019 KAKAO BLIND RECRUITMENT λ§€μΉ μ μ
Problem
μ½λ©ν μ€νΈ μ°μ΅ - λ§€μΉ μ μ
λ§€μΉ μ μ νλ μ¦ λνκ΅ μ‘°κ΅μλ μ μ΄μ§λ νλλ μΌλ§ μν€λ λ€μ€ νκ³Όμ₯λμ λ§μμμ λ²μ΄λ, μΉ΄μΉ΄μ€μ μ μ¬νκ² λμλ€. νμμ κ΄μ¬μμ΄νλ κ²μμ λ§μΉ¨ κ²°μμ΄ λ°μνμ¬, κ²μκ°λ°ν
programmers.co.kr
Solution
1. νμ΄μ§μ νμν μ 보λ₯Ό λ΄λ κ°μ²΄λ₯Ό λ§λ€μ΄μ€λ€.
λͺλ²μ§Έ μΈλ±μ€μΈμ§,μμ μ url,μ΄ μ μ,μΈλΆ λ§ν¬λ₯Ό νλ‘νΌν°λ‘ μ€μ ν΄μ€λλ€.
struct Page {
var index:Int, url:String,score:Double,externalLinks:[String]
}
2. "<" κΈ°μ€μΌλ‘ pageμ λ¬Έμμ΄μ μλ₯Έλ€.
let tags = page.split(separator: "<")
3. λλ μ§ νκ·Έλ³λ‘ μ 보λ₯Ό μμλΈλ€.
λ§μ½ μ κΈμκ° meta p(meta property)μΌ κ²½μ° μμ μ urlμ λ»νλ―λ‘ urlμ μ€μ ν΄μ€λλ€. (μμ€ μ½λμμ getWebpageURLλ₯Ό μ°Έκ³ ν΄μ£ΌμΈμ!)
/bodyμΌ κ²½μ° bodyκ° λλ κ²μ΄λ―λ‘ μ μλ₯Ό μΈν ν΄μ€λλ€.
a hrefμΌ κ²½μ° μΈλΆ λ§ν¬λ₯Ό λ»νλ―λ‘ μΈλΆλ§ν¬λ₯Ό μΈν ν΄μ€λλ€.
bodyμΌ κ²½μ° scoreμ +1μ ν΄μ£Όμ΄ 0μΌλ‘ λ§λ€μ΄μ€λλ€.
κ·Έ μΈ μΌ κ²½μ°μ bodyμμ wordλ₯Ό μ°Ύμλ΄μ΄ μ μμ μΆκ°ν΄μ€λλ€. (μμ€ μ½λμμ findWordInBodyλ₯Ό μ°Έκ³ ν΄μ£ΌμΈμ!)
var pageInfos:[Page] = []
for (i,page) in pages.enumerated() {
var pageInfo = Page(index:i,url: "", score: 0, externalLinks: [])
let tags = page.split(separator: "<")
var score:Double = -1
for tag in tags {
if String(tag.prefix(6)) == "meta p" {
pageInfo.url = getWebpageURL(tag: String(tag))
}
if String(tag.prefix(5)) == "/body" {
pageInfo.score = score
break
}
if String(tag.prefix(6)) == "a href" {
let url = tag.split(separator: "\"")[1]
pageInfo.externalLinks.append(String(url))
}
if String(tag.prefix(4)) == "body" {
score += 1
}
if score > -1 {
findWordInBody(tag: String(tag), word: word.lowercased(), score: &score)
}
}
pageInfos.append(pageInfo)
}
3. λ§€μΉ μ μκ° κ°μ₯ λμ μΈλ±μ€λ₯Ό μ°ΎμλΈλ€.
func getMaxMatchingScoreIndex(pageInfos:inout [Page]) -> Int {
for pageInfo in pageInfos {
for link in pageInfo.externalLinks {
if let index = pageInfos.firstIndex(where: {$0.url == link}) {
pageInfos[index].score += pageInfo.score/Double(pageInfo.externalLinks.count)
}
}
}
return pageInfos.sorted{($0.score) > ($1.score)}.first?.index ?? 0
}
4. λ§€μΉ μ μκ° κ°μ₯ λμ μΈλ±μ€λ₯Ό λ°ννλ€.
return getMaxMatchingScoreIndex(pageInfos: &pageInfos)
Source Code
P.S
ν μ€νΈ μΌμ΄μ€ 8λ²λ§ νλ €μ μ°Ύμλ΄€λλ μ΄ μ μλ₯Ό Doubleλ‘ ν΄μΌνλ λ¬Έμ μλ€...