
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
import Foundation | |
struct Page { | |
var index:Int, url:String,score:Double,externalLinks:[String] | |
} | |
func solution(_ word:String, _ pages:[String]) -> Int { | |
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) | |
} | |
return getMaxMatchingScoreIndex(pageInfos: &pageInfos) | |
} | |
func getWebpageURL(tag:String) -> String { | |
let content = tag.split(separator: " ").last! | |
return String(content.split(separator: "\"")[1]) | |
} | |
func findWordInBody(tag:String,word:String,score:inout Double) { | |
let contains = tag.split(separator: " ").filter{$0.lowercased().contains(word)} | |
for contain in contains { | |
let new = contain.map{$0.isLetter ? String($0.lowercased()) : " "}.joined().split(separator: " ") | |
score += Double(new.filter{$0 == word}.count) | |
} | |
} | |
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 | |
} |
P.S
ํ ์คํธ ์ผ์ด์ค 8๋ฒ๋ง ํ๋ ค์ ์ฐพ์๋ดค๋๋ ์ด ์ ์๋ฅผ Double๋ก ํด์ผํ๋ ๋ฌธ์ ์๋ค...
'๐ Problem Solution > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ํ๋ก๊ทธ๋๋จธ์ค ๊ธฐ์ง๊ตญ ์ค์น (0) | 2021.09.10 |
---|---|
[Swift] ํ๋ก๊ทธ๋๋จธ์ค ์ํด๋ฆฌ ์ฑ๋ฆฐ์ง 6์ฃผ์ฐจ ๋ณต์ ์ ๋ ฌํ๊ธฐ (0) | 2021.09.06 |
[Swift] 2020 KAKAO INTERNSHIP ๊ฒฝ์ฃผ๋ก ๊ฑด์ค (0) | 2021.08.31 |
[Swift] ํ๋ก๊ทธ๋๋จธ์ค ์ํด๋ฆฌ ์ฑ๋ฆฐ์ง 5์ฃผ์ฐจ ๋ชจ์ ์ฌ์ (0) | 2021.08.30 |
[Swift] ํ๋ก๊ทธ๋๋จธ์ค ์ํด๋ฆฌ ์ฑ๋ฆฐ์ง 4์ฃผ์ฐจ ์ง์ ๊ตฐ ์ถ์ฒํ๊ธฐ (0) | 2021.08.28 |
๋๊ธ