이 문제는 등수를 매기는 문제로 고려해야할 점이 많은 구현 문제이다.
문제풀 때, 람다함수를 제대로 활용하고 있지 못했는데 이번 문제에서 활용해볼 수 있었다.
#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: 실행될 코드
💡 예시
auto f = []() { cout << "Hello Samsic!" << endl; };
f(); // 출력: Hello Samsic!
auto add = [](int a, int b) -> int {
return a + b;
};
cout << add(3, 5); // 출력: 8
vector<int> v = {3, 1, 4, 2};
sort(v.begin(), v.end(), [](int a, int b) {
return a > b; // 내림차순
});
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를 반환하면 올바르게 동작한다.