https://school.programmers.co.kr/learn/courses/30/lessons/42747
H-Index를 구하는 방법에 대한 문제이다.
H-Index란 과학자의 생산성과 영향력을 나타내는 지표라고 하는데, 자세한 설명은 검색하면 나온다.
알고리즘의 관점에서는 x번 이상 인용된 논문이 x편이상이고 나머지 논문이 x번 이하 인용되었다면, 그 x의 최대값을 찾는 것이라고 생각하면 편하겠다.
해서 length가 1~1000인 배열이 주어지고 해당 배열에는 0~10000의 값이 무분별하게 담겨있다.
예를 들어 6편의 논문이 있고 인용한 횟수가 각각 [0, 5, 8, 1, 21, 15] 라고 가정하면
0번 이상 인용된 논문이 0편 이상이고 나머지 논문이 0번 이하 인용 = False
5번 이상 인용된 논문이 5편 이상이고 나머지 논문이 5번 이하 인용 = False
8번 이상 인용된 논문이 8편 이상이고 나머지 논문이 8번 이하 인용 = False
1번 이상 인용된 논문이 1편 이상이고 나머지 논문이 1번 이하 인용 = False
21번 이상 인용된 논문이 21편 이상이고 나머지 논문이 21번 이하 인용 = False
15번 이상 인용된 논문이 15편 이상이고 나머지 논문이 15번 이하 인용 = False
대입해보면 모두다 정답이 아니다.
4를 대입해보면 어떨까?
4번 이상 인용된 논문이 4편 이상이고 나머지 논문이 4번 이하 인용 = True
4번 이상 인용된 논문 [5, 8, 15, 21]
4번 이하 인용된 논문 [0, 1]
여기서 주의할 점은 꼭 주어진 인용 수가 답이 아니라는 것과 인용된 논문이 x편 이라는게 아니라 x편 이상 이라는 것이다.
자 그럼 문제를 어떻게 풀것이냐?
오름차순을 하여 반복문을 사용한 후 그 안에서 비교하는 방식으로 결과를 구하려고 한다.
해결순서
1. 우선 오름차순 정렬을 한다. [0, 1, 5, 8, 15, 21]
2. 논문의 수 만큼 반복문을 시행한다. for (int i = 0; i < 논문.length(); i++)
3. 반목문을 수행할 때 마다 논문의 수에 인용된 수를 뺀값을 저장한다. Temp 라고 하겠다. int Temp = 논문.length() - i;
4. 논문의 인용된 수가 Temp보다 크거나 같으면 그 순서의 Temp 값이 정답이다.
i = 0 / 논문배열[i] = 0 / Temp = 6 - 0 = 6
if (0 >= 6) = False
i = 1 / 논문배열[i] = 1 / Temp = 6 - 1 = 5
if (1 >= 5) = False
i = 2 / 논문배열[i] = 5 / Temp = 6 - 2 = 4
if (5 >= 4) = True
i = 3 / 논문배열[i] = 8 / Temp = 6 - 3 = 3
if (8 >= 3) = False
i = 4 / 논문배열[i] = 15 / Temp = 6 - 4 = 2
if (15 >= 2) = False
i = 5 / 논문배열[i] = 21 / Temp = 6 - 5 = 1
if (21 >= 1) = False
소스코드
import java.util.Arrays;
class Solution {
public int solution(int[] citations) {
int answer = 0;
Arrays.sort(citations);
for (int i = 0; i < citations.length; i++) {
int temp = citations.length - i;
System.out.println("i = " + i + " citations : " + citations[i] + " Temp : " + temp);
if (temp <= citations[i]) {
answer = temp;
break;
}
}
return answer;
}
}
진짜 오랜만에 알고리즘 문제 풀었는데 엄청 오래걸렸다... 레벨 1부터 다시 해야할 것 같다.
'문제풀이 > 프로그래머스' 카테고리의 다른 글
오픈채팅방 / 프로그래머스 연습문제 / programmers / level2 / Java (0) | 2021.08.06 |
---|---|
짝지어 제거하기 / 프로그래머스 연습문제 / programmers / level2 / Java (0) | 2021.08.05 |
124 나라의 숫자 / 프로그래머스 연습문제 / programmers / level2 / Java (0) | 2021.08.03 |
콜라츠 추측 / 프로그래머스 연습문제 / programmers / level1 / Java (0) | 2021.08.01 |
제일 작은 수 제거하기 / 프로그래머스 연습문제 / programmers / level1 / Java (0) | 2021.07.31 |