프로그래머스
[프로그래머스] H-Index Swift
띵지니어
2024. 8. 15. 18:48
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/42747
내 코드
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의 개념은 아래와 같습니다.
[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()를 씌우면 답이 나오게 됩니다.
반응형