πŸ“– Problem Solution/Programmers

[Swift] 2019 KAKAO BLIND RECRUITMENT 맀칭 점수

Fomagran πŸ’» 2021. 9. 4. 12:08
728x90
λ°˜μ‘ν˜•

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둜 ν•΄μ•Όν•˜λŠ” λ¬Έμ œμ˜€λ‹€...

728x90
λ°˜μ‘ν˜•