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이다
이 결과만 봤을 때는 for문을 끝까지 돌려도 문제 될 이유가 없다.
그러나
입출력 예시 = [1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 9999]
이 입출력의 H-index는 10이다.
나의 틀린 코드 기준으로는 0이 나온다
애초에 for 조건을 잘못 적은 것이다.
일단 문제를 찾았으니
나중에 break;가 없으면 왜 틀리는지 조사해보겠다.
======================================================
당연히 break;가 없으면 안된다.
바로 위의 예시에서 보았듯이
루프가 반복될수록 answer는 작아진다.
answer가 가장 최댓값이 될 경우는 값이 처음으로 true가 될 때이니 당연히 break;로 루프를 탈출해야 정답이 된다.