문제 보러 가기 👈 클릭!
초기에는 단순히 다음과 같이 코드를 짰다.
def solution(citations):
N = len(citations)
citations.sort()
h = 0
for idx, val in enumerate(citations):
if val > N - idx:
break
h = val
return h
하지만 이 코드는 테스트코드 16개 중 단 2개만 통과했다.
질문하기 게시판을 통해 다음과 같은 테스트 케이스를 알 수 있었다.
citations = [9, 9, 9, 12], answer = 4
citations = [9, 7, 6, 2, 1], answer = 3
즉, 오름차순 정렬 된 citations에서
현재 인용 횟수 > 현재 인용 횟수 이상을 가지는 논문의 개수 인 상황에서 h는 현재 인용 횟수 이상을 가지는 논문의 개수가 될 수 있다.
h가 될 수 있는 값들 중 최대값이 h_index이므로 다음과 같은 상황에서
h = max(이전 h,현재 인용 횟수 이상을 가지는 논문의 개수) 이다.
def solution(citations):
N = len(citations)
citations.sort()
h = 0
for idx, val in enumerate(citations):
if val > N - idx: #N - idx = 자신 포함 val이상인 논문 개수
h = max(h, N - idx)
break
h = val
return h
프로그래머스의 다른 사람 코드들 중 좋은 코드들 👇👇👇👇👇
def solution(citations):
citations.sort(reverse=True) #내림차순 정렬
answer = max(map(min, enumerate(citations, start=1)))
return answer
citations을 내림차순 정렬하고, start를 1로 지정
=> enumerate(citations, start=1)은 현재 인용 횟수 , 현재 인용 횟수 이상을 가지는 논문의 개수를 반복한다.
map(min, enumerate(citations, start=1))
=> 현재 인용 횟수 , 현재 인용 횟수 이상을 가지는 논문의 개수 중 작은 값을 선택
max(map(min, enumerate(citations, start=1)))
=> 그 중 최대값을 선택
if문으로 상황을 나누지 않고 모든 상황에서 똑같이 적용되는 방법이다.
이렇게 if문이 적은 코드가 버그가 발생 할 확률이 적은 코드이기 때문에 좋은 코드이지만 해당 방법은 반복문을 중간에 빠져나오지 않고 모두 반복한다.
def solution(citations):
citations = sorted(citations)
l = len(citations)
for i in range(l):
if citations[i] >= l-i:
return l-i
return 0
📝 아직 부족한 점이 많다. 더 노력하자!