๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

๋ฌธ์ œ

๋ฌธ์ œ ์„ค๋ช…

H-Index๋Š” ๊ณผํ•™์ž์˜ ์ƒ์‚ฐ์„ฑ๊ณผ ์˜ํ–ฅ๋ ฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค. ์–ด๋Š ๊ณผํ•™์ž์˜ H-Index๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์ธ h๋ฅผ ๊ตฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์œ„ํ‚ค๋ฐฑ๊ณผ1์— ๋”ฐ๋ฅด๋ฉด, H-Index๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๊ณผํ•™์ž๊ฐ€ ๋ฐœํ‘œํ•œ ๋…ผ๋ฌธ nํŽธ ์ค‘, h๋ฒˆ ์ด์ƒ ์ธ์šฉ๋œ ๋…ผ๋ฌธ์ด hํŽธ ์ด์ƒ์ด๊ณ  ๋‚˜๋จธ์ง€ ๋…ผ๋ฌธ์ด h๋ฒˆ ์ดํ•˜ ์ธ์šฉ๋˜์—ˆ๋‹ค๋ฉด h์˜ ์ตœ๋Œ“๊ฐ’์ด ์ด ๊ณผํ•™์ž์˜ H-Index์ž…๋‹ˆ๋‹ค.

์–ด๋–ค ๊ณผํ•™์ž๊ฐ€ ๋ฐœํ‘œํ•œ ๋…ผ๋ฌธ์˜ ์ธ์šฉ ํšŸ์ˆ˜๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด citations๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์ด ๊ณผํ•™์ž์˜ H-Index๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

  • ๊ณผํ•™์ž๊ฐ€ ๋ฐœํ‘œํ•œ ๋…ผ๋ฌธ์˜ ์ˆ˜๋Š” 1ํŽธ ์ด์ƒ 1,000ํŽธ ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ๋…ผ๋ฌธ๋ณ„ ์ธ์šฉ ํšŸ์ˆ˜๋Š” 0ํšŒ ์ด์ƒ 10,000ํšŒ ์ดํ•˜์ž…๋‹ˆ๋‹ค.

ํ’€์ด

h-index์˜ ๊ทœ์น™์ด h๋ฒˆ ์ด์ƒ ์ธ์šฉ๋œ ๋…ผ๋ฌธ์˜ ๊ฐœ์ˆ˜๊ฐ€ h๋ฒˆ ์ด์ƒ์ด ๋˜๋Š” ์ตœ๋Œ€๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋‹จ์ˆœํžˆ ์˜ค๋ฆ„์ฐจ์ˆœ, ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๋’ค์— ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ํŠน์ • ์ธ๋ฑ์Šค ์ด์ „์— ๋…ผ๋ฌธ์ด ๋ช‡๊ฐœ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ €๋Š” ์ด๋ฒˆ ๋ฌธ์ œ๊ฐ€ ์ด๋ถ„ ํƒ์ƒ‰์œผ๋กœ๋„ ํ’€์ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์„œ, ์—ฐ์Šตํ• ๊ฒธ ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ํ’€์ดํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋กœ ์ •๋ ฌ์„ ํ•˜์ง€ ์•Š๊ณ , ํƒ์ƒ‰ํ•  ๋Œ€์ƒ์„ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋กœ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ถ„ํƒ์ƒ‰์„ ํ†ตํ•ด ํŠน์ •ํ•œ ์ธ๋ฑ์Šค๊ฐ€ ์„ค์ •๋˜๋ฉด ํ•ด๋‹น ์ธ๋ฑ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋…ผ๋ฌธ์˜ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŠธํ•ด์„œ ๋งŒ์•ฝ ์ธ๋ฑ์Šค๋ณด๋‹ค ๋ฐœํ–‰๋œ ๋…ผ๋ฌธ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ™๊ฑฐ๋‚˜ ๋งŽ๋‹ค๋ฉด ํƒ์ƒ‰ ๋ฒ”์œ„์˜ ์™ผ์ชฝ์„ ์ฆ๊ฐ€์‹œํ‚ค๊ณ , ์ž‘๋‹ค๋ฉด ํƒ์ƒ‰ ๋ฒ”์œ„์˜ ์˜ค๋ฅธ์ชฝ์„ ๊ฐ์†์‹œ์ผœ ํƒ์ƒ‰๋ฒ”์œ„๋ฅผ ์ขํ˜€๋‚˜๊ฐ‘๋‹ˆ๋‹ค.

 

์ฝ”๋“œ

import Foundation

func isHIndex (_ citations:[Int], _ index:Int) -> Bool {
    return citations.filter({ $0 >= index }).count >= index
}

func binarySearch (_ start:Int, _ end:Int, _ citations:[Int]) -> Int{
    
    var head = start
    var tail = end
    var mid = (start + end) / 2
    var hIndex = 0
    
    while head <= tail {
        mid = (head + tail) / 2
        if isHIndex(citations, mid) {
            head = mid + 1
            hIndex = mid
        }else {
            tail = mid - 1
        }
    }
    return hIndex
}

func solution(_ citations:[Int]) -> Int {
    return binarySearch(0, citations.count, citations)
}