Company
교육 철학

STL을 사용하여 문제 풀이 연습하기

sort를 사용하기 전에 람다식을 알게되면 sort를 편하게 사용할 수 있는 경우가 많다.
C++에서 람다식(lambda expression)은 익명 함수(anonymous function)를 정의하는 방법으로, 짧고 간결하게 함수 객체를 생성할 수 있습니다. 람다식은 일반적으로 코드 블록을 함수 인라인으로 정의할 때 사용됩니다. C++11부터 도입되었으며, 이후의 C++ 표준에서도 지속적으로 개선되고 있습니다.
람다식의 기본 구조는 다음과 같습니다:
[capture](parameters) -> return_type { // 함수 본문 }
C++
복사

구성 요소

1.
캡처 리스트 (Capture list): 람다식이 정의된 범위 내의 변수를 캡처하여 람다식 내부에서 사용할 수 있게 합니다. [] 안에 캡처할 변수들을 명시합니다.
[=] : 외부 변수들을 값으로 캡처 (복사).
[&] : 외부 변수들을 참조로 캡처.
[x, &y] : x는 값으로, y는 참조로 캡처.
2.
매개변수 리스트 (Parameters list): 함수와 마찬가지로 람다식이 받을 매개변수를 정의합니다.
3.
반환 타입 (Return type): 반환 타입을 명시적으로 지정할 수 있으며, > 기호를 사용합니다. C++14부터는 반환 타입을 생략할 수 있습니다. 컴파일러가 자동으로 추론합니다.
4.
함수 본문 (Function body): 람다식의 실제 코드가 들어가는 부분입니다.

예제

1.
간단한 람다식 예제:
auto add = [](int a, int b) -> int { return a + b; }; int result = add(3, 4); // result는 7
C++
복사
1.
외부 변수 캡처:
int x = 10; int y = 20; auto addXY = [x, &y](int a) { return a + x + y; }; int result = addXY(5); // result는 35, x는 10, y는 20
C++
복사
1.
캡처 리스트 예제:
int a = 1, b = 1; auto fib = [=]() mutable { int temp = a; a = b; b = temp + b; return temp; }; for (int i = 0; i < 5; ++i) { std::cout << fib() << " "; // 1 1 2 3 5 }
C++
복사
1.
람다식을 인자로 전달:
#include <algorithm> #include <vector> #include <iostream> int main() { std::vector<int> vec = { 1, 2, 3, 4, 5 }; std::for_each(vec.begin(), vec.end(), [](int& n) { n *= 2; }); for (int n : vec) { std::cout << n << " "; // 2 4 6 8 10 } return 0; }
C++
복사
람다식은 함수 객체와 비교해 간결하고 가독성이 좋으며, 코드 작성 및 유지보수를 용이하게 해줍니다. C++11부터 시작하여 C++14, C++17, C++20 표준까지 지속적으로 기능이 확장되어 더욱 유용하게 사용될 수 있습니다.
algorithm 헤더를 사용해서 sort 정렬 함수를 사용 할 수 있다.
#include <algorithm>
C++
복사
std::sort 함수 원형
template<class RandomIt> void sort(RandomIt first, RandomIt last); template<class RandomIt, class Compare> void sort(RandomIt first, RandomIt last, Compare comp);
C++
복사
first: 정렬을 시작할 범위의 첫 번째 요소를 가리키는 반복자
last: 정렬을 종료할 범위의 마지막 다음 요소를 가리키는 반복자
comp: (optional) 정렬 기준을 제공하는 함수나 함수 객체로 람다식으로 표현될 수 있다
만약 비교함수 comp가 사용자에 의해 제공되지 않은 경우 기본적으로 < 연산자를 사용하여 비교를 수행하며, 이를 통해 오름차순으로 정렬한다.

비교함수 멤버함수 사용

#include <bits/stdc++.h> #define fastio cin.tie(0)->sync_with_stdio(0) using namespace std; struct Info { int val; bool operator < (const Info& i) const { return val > i.val; // val이 큰 원소가 앞에 오도록 정렬 } }; int main() { fastio; vector<Info> v; for (int i = 1; i <= 5; i++) v.push_back(Info{ i }); sort(v.begin(), v.end()); for (auto& i : v) cout << i.val << ' '; cout << '\n'; // 5 4 3 2 1 }
JavaScript
복사

비교함수 전역함수 사용

#include <bits/stdc++.h> #define fastio cin.tie(0)->sync_with_stdio(0) using namespace std; bool Cmp(const string& a, const string& b) { if (a.size() != b.size()) return a.size() < b.size(); // size가 작은 원소가 앞에 오도록 정렬 return a > b; // size가 같은 경우엔 사전 순으로 더 뒤에 있는 원소가 앞에 오도록 정렬 } int main() { fastio; vector<string> v{ "stack", "queue", "list", "set", "map" }; sort(v.begin(), v.end(), Cmp); for (auto& i : v) cout << i << ' '; cout << '\n'; // set map list stack queue }
JavaScript
복사

비교함수 작성(람다식 사용)

auto compare = [](int a, int b) { return a < b; }
C++
복사
두 요소를 받아들여 비교한 결과를 반환하여 정렬의 순서를 결정하는 비교함수를 작성한다. 비교 함수의 반환값이 양수인 경우 sort함수는 두 요소의 순서를 바꾼다. 위와 같이 람다식을 사용해 인수로 넘겨줄 비교함수를 작성할 수 있다.
보통 정수형 벡터의 경우 오름차순으로 정렬할 때는 return a < b; 내림차순으로 정렬할 때는 return a > b;로 정의하는데 여기서 의문이 생긴다.
a < b가 참일 때 두 요소의 순서가 바뀐다면 큰 수가 앞에 오게되니까 내림차순 정렬되는게 아닌가?
그런데 실제로는 그렇지 않다. 이는 a에 뒷 요소가 들어오기 때문이며 출력을 해보면 이사실을 알 수 있다.
#include <iostream> #include <cstdio> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> numbers = {5, 4, 3, 2, 1}; sort(numbers.begin(), numbers.end(), [](int a, int b) { printf("a: %d, b: %d\n", a, b); return a < b; }); cout << "Sorted numbers in ascending order: "; for (const auto& num : numbers) { cout << num << " "; } cout << endl; return 0; }
C++
복사
정수형 벡터 오름차순 정렬 예시
#include <iostream> #include <vector>#include <algorithm> using namespace std; int main() { vector<int> numbers = {5, 2, 8, 1, 7, 3}; sort(numbers.begin(), numbers.end()); cout << "Sorted numbers in ascending order: "; for (const auto& num : numbers) { cout << num << " "; } cout << endl; return 0; }
C++
복사
람다식으로 비교함수를 정의하여 정수 내림차순 정렬 예시
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> numbers = {5, 2, 8, 1, 7, 3}; sort(numbers.begin(), numbers.end(), [](int a, int b) { return a > b; }); cout << "Sorted numbers in descending order: "; for (const auto& num : numbers) { cout << num << " "; } cout << endl; return 0; }
C++
복사
람다식 비교함수에서 외부 변수를 캡쳐하여 구조체를 정렬하는 예시
#include <iostream> #include <vector> #include <algorithm> using namespace std; struct Person { std::string name; int age; }; int main() { vector<Person> people = { {"Alice", 25}, {"Bob", 30}, {"Charlie", 22}, {"David", 28} }; sort(people.begin(), people.end(), [](const Person& a, const Person& b) -> bool { return a.age < b.age; }); cout << "Sorted people with age:" << endl; for (const auto& person : people) { cout << person.name << " (" << person.age << ") " << endl; } return 0; }
C++
복사
원본 배열을 직접 변경하지 않고 원본 배열의 요소들이 정렬될 순서를 담은 인덱스 배열을 확보하는 예시
#include <iostream> #include <vector> #include <algorithm> #include <numeric> // iota 함수를 위해 필요 using namespace std; int main() { vector<int> numbers = {5, 2, 8, 1, 7, 3}; vector<int> indices(numbers.size()); // 인덱스 초기화 iota(indices.begin(), indices.end(), 0); // 인덱스 벡터를 원본 배열의 값에 따라 정렬 sort(indices.begin(), indices.end(), [&numbers](int i1, int i2) { return numbers[i1] < numbers[i2]; }); cout << "Sorted indices based on the values in the original array: "; for (int i : indices) { cout << i << " "; } cout << endl; cout << "Original array sorted based on the sorted indices: "; for (int i : indices) { cout << numbers[i] << " "; } cout << endl; return 0; }
C++
복사
그 외적으로 여러가지 stl에서 제공되는 알고리즘 함수들

다양한 STL 알고리즘 함수

예약어
설명
for_each
모든 요소를 지정한 함수로 조작
find
요소 검색
find_if
지정한 조건을 만족하는 요소 검색
min_element
최소 요소 리턴
max_element
최대 요소 리턴
sort
요소 정렬
count
지정한 숫자와 일치하는 요소 수 리턴
count_if
지정한 조건을 만족하는 요소 수 리턴
all_of
모든 요소가 지정한 조건을 만족하면 true 리턴
none_of
모든 요소가 지정한 조건을 만족하지 않으면 true 리턴
any_of
모든 요소 중에 어느 하나라도 지정한 조건을 만족하면 true 리턴
fill
모든 요소에 지정한 값을 대입
copy
모든 요소를 복사
copy_if
지정한 조건을 만족하는 요소만 복사
generate
모든 요소에 지정한 연산 결과를 대입
transform
모든 요소를 지정한 함수로 변환
remove
지정한 숫자에 일치하는 요소를 제거
remove_if
지정한 조건을 만족하는 요소를 제거
replace
지정한 숫자를 지정한 숫자로 변경
replace_if
지정한 조건에 만족하는 요소를 지정한 숫자로 변경
random_shuffle
모든 요소를 셔플
accumulate
모든 요소의 집계 계산

“강의는 많은데, 내 실력은 왜 그대로일까?”

혼자서 공부하다 보면
이런 생각 들지 않으셨나요?
강의는 다 듣고도 직접 코드는 못 짜겠고,
복습할 땐 어디서부터 다시 시작해야 할지 막막하고,
질문하려 해도 물어볼 사람이 없고,
유튜브 영상도 정답만 보고 따라 치는 느낌
그렇다면 지금이 바로
“나만을 위한 코칭”이 필요한 순간입니다.

당신도 할 수 있습니다.

지금 멤버십을 넘어, 코칭에 도전해보세요.
수많은 수강생들이 얌얌코딩 코칭으로 넥슨, 크래프톤, NC 등 입사에 성공했습니다.
프리미엄 코칭 안내 바로가기
또는 카톡 오픈채팅: 얌얌코딩 상담방
지금도 코딩을 ‘따라 치기만’ 하고 계신가요?
이젠 혼자 설계하고, 스스로 코딩하는 법을 배워야 할 때입니다.
얌얌코딩이 옆에서 함께하겠습니다.