티스토리 뷰
내림차순으로 정렬하면
6 5 3 1 0
6부터 점검한다.
6 1 X
h=6번 이상 인용된 논문 : 1편. h=6보다 작으므로 아님
5 2 X
h=5번 이상 인용된 논문 : 2편. h=5보다 작으므로 아님
3 3 O
h=3번 이상 인용된 논문 : 3편. h=3보다 크거나 같으므로 h-index
1 4 O
0 5 O
보면 index+1의 값이 곧 인용논문의 수가 된다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(int a, int b) {
return a>b;
}
int solution(vector<int> citations) {
int answer = 0;
sort(citations.begin(),citations.end(),cmp);
for(int i = 0; i < citations.size(); i++) {
if(citations[i] <= i+1)
return citations[i];
}
return 0;
}
첫 코드는 이러하였다.

예제가 하나뿐이기 때문에 놓친 게 많을거라 생각했다.
떠올린 반례는 위의 예제에서 3대신 4를 넣은 경우였다.
6 1
5 2
4 3
1 4
0 5
의 경우에서 1을 반환하게 된다. 이 문제를 해결하기 위해, 조건문을 하나 추가했다.
for(int i = 0; i < citations.size(); i++) {
if(citations[i] == i+1)
return i+1;
else if(citations[i] < i+1) {
return i;

그러나 테스트 9에서 하나 실패가 뜬다 ㅠㅠ
이건 그냥 반례 제시해주는거 찾아봤는데 [4, 4, 4] 값을 넣고 돌려보라고 하더라.
이 경우의 답은 3이어야 한다. 그러나 내가 짠 코드에서는 반복문을 다 돌고 그대로 탈출하기 때문에 0이 반환되고 있었다.
코드를 좀 개편할 필요를 느꼈다.
int solution(vector<int> citations) {
int answer = 0;
sort(citations.begin(),citations.end(),cmp);
for(int i = citations[0]; i > 0; i--) {
answer = 0;
for(int ele : citations) {
if(ele < i)
break;
else
answer++;
}
if(answer == i)
return answer;
}
return 0;
}
아예 반복문에서 1씩 감소시키면서 모든 값을 검사토록 했다. 6, 5, 3, 1, 0 이렇게 검사하지 않고 6,5,4,3,2,1 이렇게 h-index가 되는지 검사했다.
이러니까 테스트케이스 11이 틀린다 ㅠㅠ 어흑
참지못하고 찾아보니ㅏ [1,1,0]을 검사해보라고 한다. 사실 이쯤부터는 그냥 반례를 해결하기 위한 코딩을 한 기분이다;
int solution(vector<int> citations) {
sort(citations.begin(),citations.end(),cmp);
for(int i = citations[0]; i > 0; i--) {
int ref = 0;
for(int ele : citations) {
if(ele < i)
break;
else
ref++;
}
if(ref >= i)
return i;
}
return 0;
}
이렇게 해결할 수 있었다.
'■ 알고리즘 > ◻ Programmers' 카테고리의 다른 글
[C++] 모의고사 (0) | 2022.11.11 |
---|---|
[C++]최소직사각형 (0) | 2022.11.10 |
[C++]가장 큰 수 (0) | 2022.11.09 |
[C++] K번째수 (0) | 2022.11.09 |
[C++] 위장 (0) | 2022.11.09 |