프로그래머스 lv 2. 42747 c++ H-index

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

#include <bits/stdc++.h>

using namespace std;

int solution(vector<int> v) {
    int answer = 0;
    for(int i=v.size();i>=0;i--){
        int cnt=0;
        for(auto t: v) {
            if(t>=i) cnt++; 
        }
        if(cnt>=i) answer=max(answer,i);
    }
    return answer;
}

예를들어서, 전체 논문이 6편이면, 그중 6편의 논문이 조건을 만족하는지, , 5편의 논문이 조건을 만족하는지, 4편의 논문이 조건을 만족하는지 ... 등등 테스트해보면서 answer의 값을 갱신시켰다. 

굉장히 생각하기에 까다로운 문제였다. 문제부터 '이상' 과 '이하' 라는 단어가 겹쳐지는 구간이 있게 사용되어서 더 헷갈렸다.

 

다른 사람의 풀이를 보니까 아주 간결하게 딱 정답을 찾아서 멈출 수 있게 풀이를 작성한 코드가 있어서 첨부해본다. 

#include <bits/stdc++.h>

using namespace std;

int solution(vector<int> citations) {
    sort(citations.begin(), citations.end(), greater<int>());

    for (int i = 0; i < citations.size(); ++i) {
        if (citations[i] <= i) {
            return i;
        }
    }
    return citations.size();
}

sort()를 어따가 쓸까 싶었는데, 이렇게 해놓으면 큰것부터 차례대로 보면서 값을 찾아내려가다가 발견하면 멈출 수 있다. 

성능 측면에서는, sort()를 수행하는 부분때문에, 그렇게 큰 차이가 발생할것은 아니라고 보지만, 

그래도 굉장히 절차적으로 진행하다가 원하는 값이 나왔을때 멈춘다는 부분에서 매력적인 코드라고 생각한다. 

 

  Comments,     Trackbacks