https://school.programmers.co.kr/learn/courses/30/lessons/42747?language=java
문제 설명
H-index: 과학자 생산성, 영향력 지표
논문 n편 중, h번 이상 인용된 논문이 h편 이상이고, 나머지 논문이 h번 이하 인용되었다면, h의 최댓값이 h-idx임.
입출력 예
인용횟수: citations
[3, 0, 6, 1, 5] -> 3
논문 5편 중, 3편의 논문이 3회이상(3,5,6) 인용됨. 나머지 2편은(0,1) 3회 이하 인용되었기에 h-idx는 3임.
풀이
h-idx 구하기.
(도통 감도 안온다.. 입출력 예시를 추가로 생각해보자)
n개 중, h번 이상인 요소가 h개 이상이고, 나머지 요소가 h번 이하라면 h의 최댓값 반환.
가령, [1,2,3,4]의 경우
h 후보: 3
3번 이상 인용 논문: 2개(3편 이상이 아니므로 탈락)
h 후보: 2
2번 이상 인용 논문: 3개(2편 이상 충족)
나머지 논문: 1개(2번 이하 충족)
-> h-idx: 2
그렇다면, 내림차순 정렬해서 해당 논문의 인용 횟수 >= h 인지 체크 후, h의 최댓값 구하기.
정답 코드
import java.util.*;
class Solution {
public int solution(int[] citations) {
int answer = 0;
// 1. 내림차순 정렬
Integer[] ci = Arrays.stream(citations).boxed().toArray(Integer[]::new);
Arrays.sort(ci, Collections.reverseOrder());
// 2. 해당 논문의 인용 횟수 >= h 인지 체크
for(int i=0; i<ci.length; i++){
if(ci[i] >= i+1){
answer=i+1;
}else{
break;
}
}
return answer;
}
}
int[]을 내림차순 정렬하기 위해 객체 배열로 변환하는 코드가 어려워서, 내림차순 정렬 없이 풀 수 있는 방법은 없나?하고 찾아봤는데, 아래와 같이 풀면 된다!
다른 사람의 풀이
class Solution {
public int solution(int[] citations) {
int answer = 0;
Arrays.sort(citations);
for(int i=0; i<citations.length; i++){
int smaller = Math.min(citations[i], citations.length-i);
answer = Math.max(answer, smaller);
}
return answer;
}
}
입력값인 int[]을 컬렉션화 하기 위해 stream()을 썼는데,해당 코드를 암기하기도 어렵고 실제 코테에선 기억이 안날거 같아서 아래와 같이 ArrayList를 생성하고, 추가하는 방법이 나을것 같다.
public int solution(int[] citations) {
int answer = 0;
// 1. 내림차순 정렬
ArrayList<Integer> list = new ArrayList<>();
for (int num : citations) {
list.add(num);
}
Collections.sort(list, Collections.reverseOrder());