참고
문제해설
문제 로직고민
NOTE
•
1차원 정수 배열을 내림차순으로 정렬한 뒤, 순차순회하면서 해당 요소값이 탐색횟수 이하이면 H-Index를 구할 수 있다.
◦
단순한 접근법이었는데 더 생각하면 반례가 있다.
◦
인용 횟수에서 H-Index가 존재한다면 올바른 선택일지 모르지만, [100.99]와 같이 인용 횟수가 배열안에 없을 수도 있음.
◦
이 경우를 대비해서 배열내에 정답이 없는경우에는 배열의 길이를 반환하도록 한다.
•
위의 과정으로 작성한 코드는 일단 정답이 아니었다.
◦
다음과 같은 반례가 존재한다 [100,99,0] ⇒ 해당 경우 0때문에 결과가 0으로 반환된다.
◦
이러한 경우를 막기위해서 결과값을 해당 요소의 값과, 이전까지 탐색한 배열길이중 최대값을 내보낸다.
작성코드
NOTE
import java.util.*;
class Solution {
public int solution(int[] citations) {
Integer[] c = Arrays.stream(citations).boxed().toArray(Integer[]::new);
Arrays.sort(c, (n1,n2) -> Integer.compare(n2, n1));
int answer = c.length;
for(int i =0; i<c.length; i++){
if(c[i] <= i+1) {
answer = Math.max(c[i], i);
break;
}
}
return answer;
}
}
Java
복사
다른사람 풀이
NOTE
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;
}
}
Java
복사
더 깔끔한 코드
•
내림차순 정렬을 위해 스트림으로 복잡한 과정을 수행했는데 사실 위처럼 그냥 역순 탐색하면 되는건데 너무 복잡하게 작성한것같다.
•
중간에 if문에서 결과값을 찾으면 break을 걸어주면 완벽한 코드라 생각한다.