[프로그래머스] 등수 매기기 - c++

삼식이·2025년 5월 7일
0

알고리즘

목록 보기
46/81

등수 매기기

이 문제는 등수를 매기는 문제로 고려해야할 점이 많은 구현 문제이다.

문제풀 때, 람다함수를 제대로 활용하고 있지 못했는데 이번 문제에서 활용해볼 수 있었다.

전체코드

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

using namespace std;

vector<int> solution(vector<vector<int>> score) {
    vector<int> answer(score.size());
    vector<pair<int, int>> tmp;

    for (int i = 0; i < score.size(); i++) {
        int avg = score[i][0] + score[i][1]; 
        tmp.push_back({avg, i});
    }

    sort(tmp.begin(), tmp.end(), [](pair<int, int> a, pair<int, int> b) {
        return a.first > b.first;
    });

    int rank = 1;
    for (int i = 0; i < tmp.size(); i++) {
        if (i > 0 && tmp[i].first != tmp[i - 1].first) {
            rank = i + 1; 
        }
        answer[tmp[i].second] = rank;
    }

    return answer;
}

코드해설

먼저 평균 점수와, 해당 점수의 인덱스 값을 pair<int, int> 에 저장하여 tmp 배열에 push back 한다.

vector<int> answer(score.size());
vector<pair<int, int>> tmp;

for (int i = 0; i < score.size(); i++) {
    int avg = score[i][0] + score[i][1]; 
    tmp.push_back({avg, i});
}

그 후 람다함수를 통해

sort(tmp.begin(), tmp.end(), [](pair<int, int> a, pair<int, int> b) {
	return a.first > b.first;
});

tmp배열에서 평균점수가 높은 pair 순으로 내림차순 정렬한다.

[람다함수]

✅ 람다함수란?
람다 함수는 함수 객체(functor)처럼 사용할 수 있는 익명 함수이다.
일회성 사용, 정렬 기준 제공, 콜백 함수 작성 등에 자주 사용된다.

람다함수 기본 문법

[capture](parameters) -> return_type {
    function_body;
};
  • capture (캡처 리스트): 외부 변수를 람다 내부에서 사용하고자 할 때 사용
    ([], [=], [&], [a, &b] 등)

  • parameters: 매개변수 목록

  • return_type (생략 가능): 반환형

  • function_body: 실행될 코드


💡 예시

  1. 가장 기본적인 형태
auto f = []() { cout << "Hello Samsic!" << endl; };
f(); // 출력: Hello Samsic!
  1. 매개변수와 반환값이 있는 람다
auto add = [](int a, int b) -> int {
    return a + b;
};
cout << add(3, 5); // 출력: 8
  1. 정렬 기준으로 사용하는 예
vector<int> v = {3, 1, 4, 2};
sort(v.begin(), v.end(), [](int a, int b) {
    return a > b;  // 내림차순
});
  1. 외부 변수 캡처
int x = 10;
auto f = [x](int a) {
    return a + x;
};
cout << f(5); // 출력: 15

캡처 방식 요약:

캡처 방식설명
[]아무 변수도 캡처하지 않음
[=]외부 변수를 값(value)으로 복사
[&]외부 변수를 참조(reference)로 캡처
[x]변수 x만 값으로 캡처
[&x]변수 x만 참조로 캡처

보통

  • 정렬 기준 커스터마이징할 때

  • 간단한 일회성 함수가 필요할 때

  • 함수 포인터나 함수 객체보다 간단하게 처리하고 싶을 때

사용한다.


그 후, 동점자 처리를 위해 rank 변수를 생성한다.

int rank = 1;
    for (int i = 0; i < tmp.size(); i++) {
        if (i > 0 && tmp[i].first != tmp[i - 1].first) {
            rank = i + 1; 
        }
        answer[tmp[i].second] = rank;
    }

마지막으로 answer를 반환하면 올바르게 동작한다.

0개의 댓글