-
프로그래머스 H-index (자바) - 정렬코딩테스트 2022. 4. 7. 17:27
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회 이하입니다.
입출력 예
citationsreturn
[3, 0, 6, 1, 5] 3 틀린 풀이 1. 원래는 citations를 내림차순 정렬해서 인덱스 값과 비교하려고 했지만 citations가 int형 배열이라 다음과 같이 Comparator로 구현하면 오류가 났다(citations를 Integer 배열로 바꿔야 함)
import java.util.*; class Solution { public int solution(int[] citations) { int answer = 0; Arrays.sort(citations, new Comparator<Integer>() { public int compare(Integer a, Integer b) { return b-a; //내림차순 } }); ... return answer; } }
틀린 풀이 2. 문제를 완전 잘못 생각했다... 원래는 6,5,3,1,0 이렇게 내림 차순으로 정렬 후에 citations[i] 와 i+1 을 비교해서 citations[i] <= i+1 인 경우 h를 citations[i]로 해서 풀었다.(h가 6,5,3,1,0 중에 하나라고 잘못 생각했다.) 그런데 이 경우 [15,16,17,18]이면 h가 4여야 하는데 이런 값을 제대로 도출해내지 못한다.
맞는 풀이
: citations를 오름 차순으로 정렬한다.
예를 들어 [1,3,4,5,8] 이라고 하면 h는 0~5 중 하나의 값을 갖는다.
h가 각각 1~5일 가능성이 있는 경우를 보자. h = citations.length - i
1번 보다 많이 인용된 논문 수는 h=5 -> h가 5이면 5편의 논문이 5번 이상 인용되어야 한다. false
3번보다 많이 인용된 논문 수는 h=4 -> h가 4이면 4편의 논문이 4번 이상 인용되어야 한다. false
4번보다 많이 인용된 논문 수는 h=3 -> h가 3이면 3편의 논문이 3번 이상 인용되어야 한다. true
=> 이 경우 3편의 논문이 4번 이상 인용되었으므로 h의 최대값은 3이다.
5번보다 많이 인용된 논문 수는 h=2
8번보다 많이 인용된 논문 수는 h=1 이다.
즉, citations[i] >= h인 경우를 만족하는 h 값이 answer이다.
import java.util.*; class Solution { public int solution(int[] citations) { int answer = 0; Arrays.sort(citations); for (int i = 0; i < citations.length; i++) { if(citations[i] >= citations.length - i) { answer = citations.length - i; break; } } return answer; } }
'코딩테스트' 카테고리의 다른 글
프로그래머스 k번째 수(자바) - 정렬 -> 배열 복사 주의! (0) 2022.04.10 프로그래머스 가장 큰 수(자바) - 정렬 (0) 2022.04.07 프로그래머스 주식가격(자바) - 스택** (0) 2022.04.07 프로그래머스 다리를 지나가는 트럭(자바) - 큐** (0) 2022.04.06 프로그래머스 프린터(자바) - 큐 (0) 2022.04.06