[Swift] [28일차] H-index

·2025년 1월 4일
0

SwiftAlgorithm

목록 보기
31/105
post-thumbnail

programmers-H-Index

문제 설명

  1. H-index, 논문h번이상 인용된 논문이 h편이상일 때 그것의 최대치
  2. 예를들어 3이상 인용된게 3개이상이면 3, 4이상 4개이상이면 4 이런식으로해서 최대치구하기

문제접근

  1. Hindex가 될 수 있는 후보군을 standard로 지명하고
  2. 이제 그 기준보다 큰거를 카운팅해줘서 개수 비교 후 배열에 넣어주고 그곳에서 max값 출력하는 방식으로 짜보려 했다.

제출 코드

import Foundation

func solution(_ citations: [Int]) -> Int {
    var answer: [Int] = []
    for item in citations {
        let standard = item
        var count = 0
        for i in citations {
            if standard >= i {
                count += 1
            }
        }
        if count >= standard {
            answer.append(standard)
        }
    }
    return answer.max() ?? 0
}

채점 결과

정확성: 6.3
합계: 6.3 / 100.0
오잉 ? 한개 빼고 다틀렸다. 뭐가 문제지 ?


개선작업

반례를 찾아왔는데,
입력값 〉 [5, 6, 7, 8]
기댓값 〉 4
이게 4라고 한다. 5이상이 없으니까 0으로 출력하는 건지 알았는데,
4번보다 많이 인용되었다고 나오는거보니까 길이인가?

길이를 기준으로 한 번 해봤다.

제출코드 _ 2

import Foundation

func solution(_ citations: [Int]) -> Int {
    for i in Array(1 ... citations.count).reversed() {
        var count = 0
        for item in citations {
            if item >= i {
                count += 1
            }
        }
        if i == count {
            return count
        }
    }
    return 0
}

채점 결과

정확성: 93.8
합계: 93.8 / 100.0
한개가 틀린걸 보니까 극단적인 예시 하나 정도가 어긋난 것 같다.

11번 테스트케이스에 대한 반례였다.

citations = [6, 5, 3, 3, 0]
기대값 = 3

3보다 큰게 4개인데, 이거

if i == count {
	return count
}

이렇게 되어있어서 0을 반환하고 있었다. 이 부분을 수정했다.

if i <= count {
	return i
}

return count도 이제 어처피 같으니까 했었는데, 길이값으로 해주고 있으니까 return i로 수정!

최종코드

import Foundation

func solution(_ citations: [Int]) -> Int {
    for i in Array(1 ... citations.count).reversed() {
        var count = 0
        for item in citations {
            if item >= i {
                count += 1
            }
        }
        if i <= count {
            return i
        }
    }
    return 0
}

채점 결과

정확성: 100.0
합계: 100.0 / 100.0


타인의 코드

import Foundation

func solution(_ citations:[Int]) -> Int {
    let citations = citations.sorted() { $0 > $1 }
    var result = 0

    for i in 0..<citations.count {
        if i + 1 <= citations[i] {
            result = i + 1
        } else {
            break
        }
    }

    return result
}
  1. 거의 동일한 코드였는데, else로 바로 뛰쳐나와도 문제없게끔 sort > 를 해줘서 내림차순 정렬을 해준다음에 작은길이부터 탐색을 해줬다.
  2. 나는 반대로 길이 탐색 자체를 큰 수부터 해줬으니, 그 정도 차이가 있는 것 같다.
profile
기억보단 기록을

0개의 댓글