프로그래머스 알고리즘 (java)
H-index
코드 리뷰
어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주는 문제 입니다.
조건
- 논문수 = 배열의크기
n
- 인용 횟수
h
- 인용횟수가
h
인 논문의 수가h
이면 통과 - 반복 횟수
k
풀이 방향
가정 -1
- 작은수로 정렬
- 작은수를 기준으로 h 를 선정
- k = 배열의 크기 - 기준인 h 의 인덱스
- k < h 보다 작으면 증가
- K >= h 일 때 까지 반복
가정 -1 문제
h가 바로 통과 함
그럼 내림차순으로 정렬하고 해보자
가정-2
- 큰수로 정렬
- 큰수를 기준으로 h 를 선정
- k = 배열의 크기 - 기준인 h 의 인덱스
- k < h 보다 작으면 증가
- K >= h 일 때 까지 반복
기준을 잘못잡았다.
- k < h 보다 작으면 증가
- K >= h 일 때 까지 반복 이 아닌 k <= h 면 그만둬야함
코드
import java.util.Arrays;
public class HIndex {
public int solution(int[] citations) {
int answer = 0;
int length = citations.length;
int h = 0;
int k = 0;
Arrays.sort(citations);
for (int i = 0; i < citations.length; i++) {
h = citations[i];
k = citations.length - i;
if (k <= h) {
answer = k;
break;
}
}
return answer;
}
}
느낀 점
저는 알고리즘을 풀 때 어떤식으로 풀어야 쉽게 문제를 풀 수 있을지 생각하는 시간이 오래 걸렸습니다. 그래서 이번엔 가정을 새우고 그 가정에 따라 코드를 구현하고 반례가 있나 확인한 후 다시 가정을 수정하는 식으로 문제를 접근했더니 예전보다 코드구현 속도가 빨라진거 같았습니다. 문제를 해결할 때 이런식으로 접근하면 알고리즘 문제를 빠르게 풀 수 있을거 같다는 자신감을 얻었습니다.