문제 설명
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회 이하입니다.
나의 풀이
이 문제에서 가장 어려웠던 접근 방법보단 사실 문제에 대한 이해였다. 일단 h-index라는 개념 자체가 처음 접하는 거였기에 정확힌 뭘 구라한 말인지를 이해를 못했다. 포인트는 (인용 횟수 = 인용된 논문 갯수) 중 최대값 이다. 이해를 위한 좀 더 상세한 예시를 아래에 적어보면
논문수가 4개인데, 각 논문의 인용 횟수가 4 이상이면 리턴값도 4이다.
논문수가 4개인데, 각 논문의 인용 횟수가 10, 8, 3, 0 이면 리턴값은 3이다.
논문수가 4개인데, 각 논문의 인용 횟수가 10, 4, 1, 0 이면 리턴값은 2이다.
이와 같은데 주의해야 하는 조건이 하나 있는데 아래와 같다.
논문수가 4개인데, 각 논문의 인용 횟수가 24, 22, 21, 20 이면 리턴값은 4이다.
왜 이 조건을 주의해야 했냐면, citations의 배열길이(논문의 갯수) < 인용 횟수 최대값이 되어버리기 때문에,
검사를 하는 반복문을 단순히 배열의 길이만큼만 반복하고 배열 중 최소값만 리턴해버리면 테스트에 실패하기 때문이다. 이 조건이 바로 테스트9 질문 페이지를 보면 테스트9의 조건이 무엇인지 물어보는 질문이 몇 있는데 이를 반영하지 못했기 때문이다. 코드2의 리턴 바로 앞 while문이 이 문제를 해소하기 위한 반복문이다.
두 번째로 주의해야 하는 조건이자 이 문제의 오류점인데
논문수가 4개인데, 각 논문의 인용 횟수가 10, 2, 2, 0 이면 리턴값은 2? 3?
위의 조건에서는 인용된 논문수 = 인용횟수가 일치하는 수 자체가 없다. 이 부분을 어찌 다뤄야 하나 고민하다가 문제에서 이런 예외를 어찌 처리해야되는지 명시된 것이 없어서 질문 게시판을 보니 이를 눈치채고 문제를 풀어본 사람들이 해당 문제가 이 예외를 아예 취급하지 않는다는 내용을 보았다. 결과적으로 실제로 이런 기능을 구현하려면 보완이 필요해 보이는 부분이다.
코드1 의 경우에는 다른 사람의 풀이법을 보고 새롭게 느껴진 접근법. 결국 리턴값은 논문수 를 초과할수 없다는 점을 포착해서 접근한 방법으로 좀 충격? 적이라 따라 작성해보고 첨부했다...
코드1
import java.util.*;
class Solution {
public int solution(int[] citations) {
int answer = 0;
Arrays.sort(citations);
int min;
for(int i = citations.length-1; i>=0; i--) {
min = Math.min(citations.length-i, citations[i]);
answer = Math.max(answer,min);
}
return answer;
}
}
코드2
import java.util.*;
class Solution {
public int solution(int[] citations) {
int answer = 0;
Arrays.sort(citations);
int index = citations.length-1;
int max = citations[index];
int count = 0;
if(max>0) {
while(index>=0) {
if(citations[index]>=max) {
count++;
index--;
if(count>=max) break;
continue;
} else {
max--;
if(count>=max) break;
continue;
}
}
}
while(max>count) {
max--;
}
return answer = count;
}
}
'Algorithm > Programmers-Algorithm' 카테고리의 다른 글
Programmers 가장 큰 수 java 풀이 (0) | 2020.08.14 |
---|---|
Programmers 모의고사 java 풀이 (0) | 2020.08.14 |
Programmers 가장 큰 수 java 풀이 (0) | 2020.08.12 |
Programmers 이중 우선순위 큐 java 풀이 (0) | 2020.08.12 |
Programmers 디스크 컨트롤러 java 풀이 (0) | 2020.08.11 |