[JAVA/프로그래머스] 정렬_H-Index

👀 문제

https://programmers.co.kr/learn/courses/30/lessons/42747

테스트케이스 추가

citations(int[]) return
[22,42] 2
[20,19,18,1] 3
[2,2,2] 2

👊 첫 번째 도전

1. 설계

  1. 배열을 내림차순으로 정렬한다.
  2. h는 배열 원소 갯수부터 시작해서 하나씩 줄어든다.
  3. 배열을 처음부터 순회하면서 원소가 h보다 같거나 크면 cnt++.
  4. 작으면 멈추고 cnt==h인지 체크, 같으면 h를 리턴한다.
  5. 다르면 h–하고 다시 처음부터 순회한다.

2. 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.Arrays;
import java.util.Collections;
/**
 *
 * @author HEESOO
 *
 */
class Solution {
    public int solution(int[] citations) {
        int answer = 0;
        int h=citations.length;
        int cnt=0;
        Integer[] array=new Integer[citations.length];
        array=Arrays.stream(citations).boxed().toArray(Integer[]::new);
        Arrays.sort(array, Collections.reverseOrder());
        for(int i=0;i<array.length;i++){
            if(array[i]>=h){//원소가 h이상이면
                cnt++;
            }
            else{
                if(cnt==h){
                    answer=h;
                    break;
                }
                else{//h--하고 처음부터 다시 시작
                    h--;
                    cnt=0;
                    i=-1;
                }
            }
            if(i==array.length-1){
                answer=h;
            }   
        }
        return answer;
    }
}

3. 결과

실행결과 실패. 테스트11에서 틀렸다.

4. 문제점

잘 모르겠다. 문제 이해도 잘 안되서 다른 풀이 코드를 참고하였다.

👊 두 번째 도전

1. 설계

  1. 인용된 논문 수(h)가 배열 순회 인덱스(i+1)보다 작아지면 i를 리턴한다.

2. 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.Arrays;
import java.util.Collections;
/**
 *
 * @author HEESOO
 *
 */
class Solution {
    public int solution(int[] citations) {
        int answer = 0;
        Integer array=new Integer[citations.length];
        array=Arrays.stream(citations).boxed().toArray(Integer[]::new);
        Arrays.sort(array, Collections.reverseOrder());
        for(int i=0;i<array.length;i++){
            if(array[i]<i+1){
                answer=i;
                break;
            }  
            if(i==array.length-1){//[22,42] 2 경우
                answer=i+1;
            }
        }
        return answer;
    }
}
  • Integer[] array: int형 배열은 Collections.reverseOrder()를 사용할 수 없으므로 Integer배열로 변환하여 저장한다.

3. 코드 설명

내림차순으로 정렬된 배열과 i를 비교한다.
h i 6 > 0
5 > 1
3 > 2___이때가 i의 최댓값이므로 횟수(i+1, 횟수는 1부터 시작)을 리턴한다.
1 < 3
0 < 4

4. 결과

실행결과 🤟 성공 🤟

👏 해결 완료!

사실 아직도 내가 문제를 잘못 이해하고 있는 것 같다. 뭔가 알고리즘 문제를 푸는 것은 문제를 얼마나 잘 이해하느냐인 것 같다.

참고