반응형
문제 설명
H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다.
어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.
어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/42747
나의 풀이 (java)
import java.util.ArrayList;
import java.util.Collections;
class Solution {
public int solution(int[] citations) {
int answer = 0;
ArrayList<Integer> citationList = new ArrayList();
for(int num : citations) {citationList.add(num);}
Collections.sort(citationList, Collections.reverseOrder());
if(citationList.get(0)==0) return 0;
for(int h=citationList.size()-1; h>=0; h--){
if(h < citationList.get(h)){
answer = h+1;
break;
}
}
return answer;
}
}
내가 사용한 방법
배열을 한번 역순 정렬(큰수가 가장 앞) => 큰 수에서 하나씩 빼면서 조건에 맞는지 확인 => 예외 추가(길이가 ==0 종료)
여기서, 조건이 중요한 로직 포인트인데
- 큰수부터 작은수로 정렬했기 때문에 배열[h] 값이 숫자 h+1보다 크거나 같음
= h+1 이상의 값이 최소 h개 이상 존재
= 위 내용을 for문과 조건으로 작성하여 해결
다른 사람의 풀이
- 중요 로직은 같음
- 디테일한 부분에서 불필요한 로직을 줄일수 있음
- Arrays.sort(citations) 해서 사용하면 3줄을 1줄로 줄일 수 있다
- if조건대신 Math.max or min을 사용하여 판단 가능
느낀점
- list를 정렬하는 여러가지 방법
- 1. Collections (java.utils 기본 적인 정렬을 사용)
- 2. List.sort() 사용 (compare 직접 구현 = 복잡한 정렬을 사용할때)
같으면0, 작으면 음수, 크면 양수로 return;
=> Result 클래스의 result1,result2를 a로 정렬, a값이 같다면 d값으로 정렬 (= order by a,d)
list.sort(new Comparator<SectionStatisticsResult>() {
@Override
public int compare(SectionStatisticsResult result1, SectionStatisticsResult result2) {
int compareResult = result1.getAptNo().compareTo(result2.getAptNo());
if(compareResult == 0 && result1.getDong() != null && result2.getDong() != null) compareResult = result1.getDong().compareTo(result2.getDong());
return compareResult;
}
});
- 큰/작은 값을 찾을때 if가 아닌 Math.max() / Math.min() 을 사용하자
반응형