C++ Programmers Test/Level 2

[Programmers] [C++] H-Index / 최댓값과 최솟값

시카Dev 2025. 4. 2. 17:36

 

<문제 설명>
H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다.
어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다.
위키백과1에 따르면, H-Index는 다음과 같이 구합니다.

어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고
나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.

어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가
매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.

<제한사항>
과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
논문별 인용 횟수는 0회 이상 10,000회 이하입니다.

<입출력 예>
citations		return
[3, 0, 6, 1, 5]		3

<입출력 예 설명>
이 과학자가 발표한 논문의 수는 5편이고,
그중 3편의 논문은 3회 이상 인용되었습니다.
그리고 나머지 2편의 논문은 3회 이하 인용되었기 때문에 이 과학자의 H-Index는 3입니다.

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<int> citations) {
    int answer = 0;
    sort(citations.begin(), citations.end(), greater<>());
    
    for (int i = 0; i < citations.size(); i++) {
        if (citations[i] > i) { answer++; } 
    }

    return answer;
}

 

원래는 기본 sort(내림차순)으로 풀었는데, 왜 안풀릴까 하루종일 고민하다 다음날에 greater<>()를 달아주니 풀렸다.

 

자칫하면 문제가 되게 헷갈릴수 있는 것 같다. 리트코드에 있는 문제를 그대로 그대로 가져온 것 같기도 하다

https://leetcode.com/problems/h-index/description/

 


 

<문제 설명>
문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다.
str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의
문자열을 반환하는 함수, solution을 완성하세요.
예를 들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다.

<제한 조건>
s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.

<입출력 예>
s		return
"1 2 3 4"	"1 4"
"-1 -2 -3 -4"	"-4 -1"
"-1 -1"		"-1 -1"

 


#include <string>
#include <vector>
#include <algorithm>
#include <sstream>

using namespace std;

string solution(string s) {
    vector<int> answer;
    int num = 0;
    string final_answer = "";

    stringstream ss(s);
    string token;
    
    while (ss >> token) {
        num = stoi(token);
        answer.push_back(num);
    }

    sort(answer.begin(), answer.end());
    final_answer = to_string(answer.front()) + " " + to_string(answer.back());
    
    return final_answer;
}

 

늘 느끼는 거지만 c++에서 문자열 다루기는 쉽지 않다...

오늘은 sstream 헤더에 대해 알게 되었다.

 

stringstream은 공백과 \n을 기준으로 자동으로 문자열을 잘라준다

while문에서 스트림으로 ss >> token을 하는 기법은 자주 사용될 것이니 꼭 암기해야겠다.

만일 벡터를 오름차순 정리했다면, 벡터의 front와 back은 자동으로 최댓값과 최솟값이 됨을 또한 기억해두자