프로그래머스

[프로그래머스] H-Index Swift

띵지니어 2024. 8. 15. 18:48
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/42747

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

내 코드

import Foundation

func solution(_ citations: [Int]) -> Int {

    var HIndex = -1

    for i in citations {
        HIndex = max(HIndex, min(i, citations.filter({ $0 >= i }).count))
    }
    
    return HIndex
}

 

Review

처음에 접근할 때는 그냥 문제 읽고 for문으로 인용 횟수 배열에서 가장 작은 값부터 큰 값으로 순회하면서

해당 인용횟수(i)보다 크거나 같은 것을 거른 배열의 크기와, 인용 횟수(i)가 같으면 된다고 생각했습니다.

import Foundation

func solution(_ citations: [Int]) -> Int {

    let minValue = citations.min()!
    let maxValue = citations.max()!

    var result = 0

    for i in minValue...maxValue {
        if (citations.filter({ $0 > i }).count) >= i {
            result = i
        }
    }
    
    return result
}

하지만 해당풀이는 엣지 케이스를 생각하지 못했던 방법이었습니다.


 

⚒️ 해결 방법

 

H-index를 제가 이해하지 못했다고 생각해서 문제에서 참고하라고 준 사이트 를 읽어보았습니다.

 

h-index - Wikipedia

From Wikipedia, the free encyclopedia Metric that attempts to measure the productivity and citation impact of a person's publications The h-index is an author-level metric that measures both the productivity and citation impact of the publications, initial

en.wikipedia.org

 

문제에서 주어지거나, 위키피디아 에서본 H-Index의 개념은 아래와 같습니다.

[10, 8, 5, 4, 3] 이 각각 논문의 인용 횟수라고 가정합니다.

1. 10번 이상 인용된 논문은 1편입니다. H-Index = 1
2. 8번 이상 인용된 논문은 2편입니다. H-Index = 2
3. 5번 이상 인용된 논문은 3편입니다. H-Index = 3
4. 4번 이상 인용된 논문은 4편입니다. H-Index = 4
5. 3번 이상 인용된 논문은 5편입니다. H-Index = 3

 

같은 방식으로 

[25, 8, 5, 3, 3] 이 각각 논문 인용 횟수를 가지는 배열이 있다 가정합니다.

1. 25번 이상 인용된 논문은 1편입니다. H-Index = 1
2. 8번 이상 인용된 논문은 2편입니다. H-Index = 2
3. 5번 이상 인용된 논문은 3편입니다.H-Index = 3
4. 3번 이상 인용된 논문은 5편입니다.H-Index = 3
5. 3번 이상 인용된 논문은 5편입니다.H-Index = 3

 

사실문제에서 주어진 지문은 아래와 같습니다.

어떤 과학자가 발표한 논문 n 편 중, h번 이상 인용된 논문이 h 편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.

이게 사실 맞는 말이지만.. 같은 h 라는 변수를 사용해서 조금 헷갈렸던 것 같습니다..

어쨌든 위 규칙을 적용해서 개념을 정리해 보면

H-Index 는 논문 n 편 중에, i 번 이상 인용된 논문이 j 편 이상이면 i 와 j 중 작은 값입니다.

H-Index = min(i, j) 이라고도 표현할 수 있겠네요

인용된 논문을 for문으로 순회시켜서, H-Index의 최댓값을 구한다면 아래와 같은 코드가 나옵니다.

for i in citations {
    HIndex = max(HIndex, min(i, citations.filter({ $0 >= i }).count))
}

 

이거는 인용 횟수가 i번 이상인 것의 개수를 센 코드입니다.

citations.filter({ $0 >= i }).count

 

그 중에서 최댓값을 구하기 위해 전체 max()를 씌우면 답이 나오게 됩니다.

 

반응형