문제

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

풀이

def solution(citations):
    citations = sorted(citations)
    answer = 0
    
    for i in range(len(citations)) :
        if i+1 >= citations[i] :
            answer = citations[i]
            
    return answer

우선 덤볐던 답안. 입출력 예제만 보고 바로 덤빈 덕분에 입출력 예제에는 적합했지만,
나머지 테스트케이스에 모두 나가리.
성급하게 덤비지 말고 천천히 문제 읽고 좀 풀자!!

항상 작은 범위의 제한사항은 힌트를 제공한다.

  • 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
  • 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.

논문의 수(Index)를 1~1,000 으로,
인용 횟수(Value)를 0~10,000로 제한했다.

음, 아무리 봐도 Index로 장난치는 문제다.

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

이 지문을 거꾸로 해석해봤다.

H-Index는 여러 h 중 최대값이고, 여러 h 는 h 번 이상

오호라, h 번 이상은 아무리 봐도 최소값이다.
[Index로 장난 + 최대값, 최소값] 로 예시를 다시 정리해보자.

Input : [3, 0, 6, 1, 5]
------------------------
1 : 0 --> min : 0
2 : 1 --> min : 1
3 : 3 --> min : 3
4 : 5 --> min : 4
5 : 6 --> min : 5
------------------------
max : 5

‘잘못 접근했나?’ 싶었지만 혹시 몰라 내림차순정렬로 재시도 해봤다.

Input : [3, 0, 6, 1, 5]
------------------------
1 : 6 --> min : 1
2 : 5 --> min : 2
3 : 3 --> min : 3
4 : 1 --> min : 1
5 : 0 --> min : 0
------------------------
max : 3

빙고!

제출한 코드

def solution(citations):
    c = sorted(citations, reverse = True)
    lst = []

    for idx, val in enumerate(c):
        lst.append(min(idx+1, val))

    return max(lst)

더 나은 풀이

def solution(citations):
    citations = sorted(citations)
    l = len(citations)
    for i in range(l):
        if citations[i] >= l-i:
            return l-i
    return 0

루프를 가장 적게 도는걸로 생각되는 코드.
내가 봐도 이렇게 접근하는게 가장 이상적이지 않았나 싶다.

def solution(citations):
    citations.sort(reverse=True)
    answer = max(map(min, enumerate(citations, start=1)))
    return answer

가장 파이썬스러웠던 코드.
.sort로 정렬한것도 나보다 나앗고,
enumerate를 map으로 묶어버린 것과,
enumerate를 1부터 시작시키는 옵션값을 넣은 것도 너무 대단했다.

파이썬은 봐도봐도 놀랍다.

댓글남기기