(통과하지 못한 코드들 입니다)
def solution(citations):
answer = 0
citations.sort()
h = citations[-1]
while answer == 0 :
cnt1 = 0
cnt2 = 0
for c in citations:
if c >= h:
cnt1 += 1
if c <= h:
cnt2 += 1
if (cnt1 >= h) and (cnt2 <= h):
answer = h
break
h -= 1
return answer
h
를 가장 큰 값부터 하나씩 감소시키며 조건을 충족하는 즉시 answer
로 반환하는 알고리즘이다. 이 경우 최대라는 조건도 함께 만족된다. 그러나, [0, 1, 2, 10000]
과 같이 불필요한 계산이 많아지는 경우 시간 초과가 분명히 발생하는 코드일 것이다. 결국 위 코드는 하나의 케이스에서 시간 초과되어 통과되지 못했다.
def solution(citations):
answer = 0
citations.sort()
start = citations[0]
end = citations[len(citations)-1]
while start <= end:
h = (start + end) // 2
cnt = 0
for c in citations:
if c >= h:
cnt += 1
if cnt >= h and (len(citations) - cnt) <= h:
start = h + 1
answer = h
else:
end = h - 1
return answer
하나씩 탐색하는 것은 무리가 있어 이진 탐색으로 작전을 변경했다.
그러나 또 하나의 케이스에서 실패했다.
if answer == 0 :
answer = len(citations)
위 예외 처리도 추가해보았으나, 이번에도 또 다른 하나의 케이스에서 실패했다.
검색을 통해 나의 문제를 발견했다.
H-Index의 개념을 완벽히 이해하지 못한 것이다.
H-Index
란,h
번 이상 인용된 논문이h
편 이상이고, 나머지 논문이h
번 이하 인용되었을 때h
의 최댓값이다.
이 때 "나머지 논문이 h
번 이하 인용"을 "나머지 논문의 수가 h
편 이하"로 착각한 상태로 구현했다. 옳게 해석하면, "나머지 논문"은 결국 h
번 미만 인용된 논문이므로 항상 h
번 이하 인용되었다는 조건을 만족하게 된다.
정리하자면 h
는 "인용 횟수가 h번 이상인 논문의 수가 h편 이상"을 만족하는 최댓값이다.
def solution(citations):
citations.sort(reverse=True)
for i, c in enumerate(citations):
if i >= c:
return i
return len(citations)
citations
배열을 내림차순 정렬 후 인덱스(i
)가 인용 횟수(c
)보다 크거나 같은 원소에 대해 해당 인덱스를 반환한다.
내림차순 정렬된 배열에서의 인덱스(i
)
= 본인보다 크기가 큰 원소의 수
= 인용 횟수가 c
보다 큰 원소의 수
= 인용 횟수가 c
번 이상인 논문의 수
즉, i
는 c
이상이어야 한다.
if
문을 거치지 않은 경우에는 배열의 길이를 반환한다. 이는 [5, 5]
와 같은 예외까지 처리해준다.