[프로그래머스] H-Index (Java)

Moveheon·2023년 9월 22일

프로그래머스

목록 보기
3/24
import java.util.*;

class Solution {
    public int solution(int[] citations) {
        int answer = 0;
        Arrays.sort(citations);

        for(int i = 0; i < citations.length; i++) {
            int count = citations.length - i;
            
            if(citations[i] >= count) {
                answer = count;
                break;
            }
        }
        return answer;
    }
}

간단해 보이지만 이해가 잘 안가는 문제다.
먼저 오름차순으로 정렬하면
각 인덱스에 따라서 n번 인덱스의 값보다 인용횟수가 이상인 논문 개수들을 구할수 있다는 것 까지는 알겠는데,
왜 for를 끝까지 돌리면 틀리는지 모르겠다.

내가 해답을 보기 전까지 작성한 코드는 아래와 같다

import java.util.*;

class Solution {
    public int solution(int[] citations) {
        int answer = 0;
        Arrays.sort(citations);

        for(int i = 0; i < citations.length; i++) {
            int count = citations.length - i;
            
            if(citations[i] <= count) {
                answer = count;
            }
        }
        return answer;
    }
}

뭔가 예외가 있는거 같은데 곰곰히 생각해봐야겠다.

=====================================================
https://dev-musa.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-Level-2-H-Index-%EC%BD%94%ED%8B%80%EB%A6%B0
이 분이 작성하신 글을 보고 한번에 이해가 되었다.

내가 쓴 코드를 기준으로 문제점을 설명해보겠다.

프로그래머스의 입출력 예시는 [3, 0, 6, 1, 5] 이고 결과값은 3이다

  • 0번 이상 인용된 논문 = 5편 > 0편 이상
  • 1번 이상 인용된 논문 = 4편 > 1편 이상
  • 3번 이상 인용된 논문 = 3편 = 3편 이상
  • 5번 이상 인용된 논문 = 2편 < 5편 이상
  • 6번 이상 인용된 논문 = 1편 < 6편 이상

이 결과만 봤을 때는 for문을 끝까지 돌려도 문제 될 이유가 없다.

그러나

입출력 예시 = [1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 9999]

  • 1번 이상 인용된 논문 = 10편 > 1편 이상
  • 2번 이상 인용된 논문 = 10편 > 2편 이상
  • 3번 이상 인용된 논문 = 10편 > 3편 이상
  • 4번 이상 인용된 논문 = 10편 > 4편 이상
  • 5번 이상 인용된 논문 = 10편 > 5편 이상
  • 6번 이상 인용된 논문 = 10편 > 6편 이상
  • 7번 이상 인용된 논문 = 10편 > 7편 이상
  • 8번 이상 인용된 논문 = 10편 > 8편 이상
  • 9번 이상 인용된 논문 = 10편 > 9편 이상
  • 10번 이상 인용된 논문 = 10편 = 10편 이상
  • 11번 이상 인용된 논문 = 10편 < 11편 미만

이 입출력의 H-index는 10이다.

나의 틀린 코드 기준으로는 0이 나온다
애초에 for 조건을 잘못 적은 것이다.

일단 문제를 찾았으니
나중에 break;가 없으면 왜 틀리는지 조사해보겠다.

======================================================

당연히 break;가 없으면 안된다.

바로 위의 예시에서 보았듯이

  • 1번 이상 인용된 논문 = 10편 > 1편 이상 (true) answer = 10
  • 2번 이상 인용된 논문 = 10편 > 2편 이상 (true) answer = 9
  • 3번 이상 인용된 논문 = 10편 > 3편 이상 (true) answer = 8
  • 4번 이상 인용된 논문 = 10편 > 4편 이상 (true) answer = 7
  • 5번 이상 인용된 논문 = 10편 > 5편 이상 (true) answer = 6
  • 6번 이상 인용된 논문 = 10편 > 6편 이상 (true) answer = 5
  • 7번 이상 인용된 논문 = 10편 > 7편 이상 (true) answer = 4
  • 8번 이상 인용된 논문 = 10편 > 8편 이상 (true) answer = 3
  • 9번 이상 인용된 논문 = 10편 > 9편 이상 (true) answer = 2
  • 10번 이상 인용된 논문 = 10편 = 10편 이상 (true) answer = 1
  • 11번 이상 인용된 논문 = 10편 < 11편 미만 (false) answer = 1

루프가 반복될수록 answer는 작아진다.
answer가 가장 최댓값이 될 경우는 값이 처음으로 true가 될 때이니 당연히 break;로 루프를 탈출해야 정답이 된다.

0개의 댓글