https://school.programmers.co.kr/learn/courses/30/lessons/42747?language=java
import java.util.*;
class Solution {
public int solution(int[] citations) {
Integer[] integerArray = Arrays.stream(citations).boxed().toArray(Integer[]::new);
Arrays.sort(integerArray, Collections.reverseOrder());
citations = Arrays.stream(integerArray).mapToInt(Integer::intValue).toArray();
int i;
for(i = 0; i < citations.length; i++){
if(citations[i] <= i)
break;
}
return i;
}
}
Max 값으로 뭐 하고 계산하고 했었는데 아니었다. 답은 간단.
일단 자바는 int 형 배열에 내림차순 을 하려면 Wrapping 하고 해야했다.
사아아아앙당히 귀찮은 작업. 존재자체도 모른다면 아예 하지 못할만할것이다.
핵심 코드는 반복문에 있다.
내림차순 정렬한 배열을 쭉 돌면서 그 안의 요소(인용 수) 가 현재 올라간 i 의 인용수보다 커야 계속 진행 한다. 그렇지 않다면 break 인데..
h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면
이라는 조건이 있다.
즉, 인용수가 인덱스보다 작거나 같아진다면 끝.

박싱, 언박싱 하는 과정 떄문인지 느리다.
import java.util.*;
class Solution {
public int solution(int[] citations) {
Arrays.sort(citations);
int max = 0;
for(int i = citations.length-1; i > -1; i--){
int min = (int)Math.min(citations[i], citations.length - i);
if(max < min) max = min;
}
return max;
}
}
다른 사람의 풀이 이다.
오름차순 정렬하고 배열을 역으로 돌면서 인용수와 배열의 개수에서 i(지금껏 돌은 수) 를 뺀 수(남은 논문 수) 중 작은 값을 구한다.
그리고 그 작은 값이 max 보다 많으면 max 갱신.

당연히 단순 For 문에 박싱, 언박싱도 안하니 속도가 아름답다.