-
프로그래머스 고득점 kit(유형정리) - H-indexAlgorithm/Sorting 2023. 1. 6. 20:51728x90
코딩테스트 연습 - H-Index | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다.
어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.
어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.
제한사항- 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
- 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.
citations return
입출력 예 설명[3, 0, 6, 1, 5] 3 이 과학자가 발표한 논문의 수는 5편이고, 그중 3편의 논문은 3회 이상 인용되었습니다. 그리고 나머지 2편의 논문은 3회 이하 인용되었기 때문에 이 과학자의 H-Index는 3입니다.
솔직하게 조금 어려운 문제였다. 당장 문제 입출력을 읽을 때만 해도 간단해 보이는 문제였는데 머리가 안돌아가서 주석으로 하나하나 적어가면서 풀어내었다.
※ 문제 이해
문제 이해는 간단하다. citations 배열에 있는 논문 n 편 중, h번 이상 인용된 논문이 h편 이상인 조건1, 나머지 논문이 h번 이하 인용되었다는 조건2 이렇게 두가지 조건을 만족시키면 된다.
※ 알고리즘
1. citations 배열을 sort로 정렬한다.
2. enumerate 내장함수를 이용하여 citiations 배열을 tuple 형식으로 index와 함께 나타내어 반복시킨다.
3. 인덱스의 숫자를 j로 두고, index를 i로 둔 상태에서 최댓값을 조사해야 하므로 len(citations) - i로 뒤에서 부터 인덱스를 조사한다.
4. 입출력 예시를 통해 하나씩 나열해 보면
i=0 0 >= 5-0=5 (x)
i=1 1 >= 5-1=4 (x)
i=2 3 >= 5-2=3 (O)
i=3 5 >= 5-3=2 (O)
i=4 6 >= 5-4=1 (O)이렇게 나열할 수 있고 이를 통해 조건에 맞는 3이라는 숫자를 확인해 볼 수 있다.
5. 조건에 맞는 만큼 count += 1 시켜주고, answer 변수에 담아서 출력시킨다.
def solution(citations): answer = 0 count = 0 citations.sort() for i, j in enumerate(citations): #(0, 0) #(1, 1) #(2, 3) #(3, 5) #(4, 6) if j >= len(citations) - i: # i=0 0 >= 5-0=5 (x) # i=1 1 >= 5-1=4 (x) # i=2 3 >= 5-2=3 # i=3 5 >= 5-3=2 # i=4 6 >= 5-4=1 count += 1 answer = count return answerlen(citations) - i 하는 부분이 조금 어려웠다. 이 부분에서 입출력 예시를 통해 억지로 만들어낸 느낌이 있지만, 다 만들어 통과해 놓고 보니 최댓값을 구하는 것이기 때문에 인덱스를 큰 수에서 빼는 형식으로 비교해야 하는 것을 알 수 있었다.
<다른 사람의 풀이>
<풀이1>
def solution(citations): citations.sort(reverse=True) answer = max(map(min, enumerate(citations, start=1))) return answer개인적으로 미친건가 싶은 풀이 이다. 처음에는 잘 이해가 되지 않았는데 댓글을 보고 이해를 했다.
댓글을 첨부해 본다.
<댓글>
sort로 정렬해서 가장 큰값부터 작은값으로 정렬한후, enumerate로 (index, value)형태로 묶는다. 그리고 최댓값(start = 1)부터 각 value에 대해 최솟값 value의 값을 min으로 추출하고, 이 추출된 값은 enumerate가 끝나는 citations 리스트의 크기에 해당하는 갯수가 나온다. 이들을 map으로 묶으면, 한 value의 입장에서 보는 최솟값 value의 집합이 나온다. 즉 h값들의 집합이나온다. h값중 최대값을 max로 뽑아서 출력하면 된다.
<풀이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나랑 비슷하게 푼 풀이였다. l-i 이 사람도 나와 비슷한 생각을 했나보다.
728x90'Algorithm > Sorting' 카테고리의 다른 글
백준 2252 - 줄 세우기 (1) 2024.02.16 프로그래머스 고득점 kit(유형정리) - K번째수 (0) 2023.01.06