프로그래머스 코딩테스트 고득점 Kit_정렬_H-Index

Minhee kang·2021년 10월 7일
0

문제 보러 가기 👈 클릭!

💡 풀이

✔ 풀이 방법

초기에는 단순히 다음과 같이 코드를 짰다.

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

프로그래머스의 다른 사람 코드들 중 좋은 코드들 👇👇👇👇👇

다른 코드1👇

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문이 적은 코드가 버그가 발생 할 확률이 적은 코드이기 때문에 좋은 코드이지만 해당 방법은 반복문을 중간에 빠져나오지 않고 모두 반복한다.

다른 코드2👇

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

📝 아직 부족한 점이 많다. 더 노력하자!

0개의 댓글