2026. 4. 22. 10:09ㆍProgrammers

문제 해석
정렬 기준이 n의 입력대로 변하기 때문에 < 커스텀 정렬 기준 > 을 세워야 한다.
C++의 sort 함수는 기본적으로 사전순으로 정렬하지만 세 번째 인자로 비교 함수를 넘기면 원하는 기준으로만 정렬할 수 있다.
핵심은 다음과 같다.
- n번째 글자가 다르면 -> n번째 글자로 비교
- n번째 글자가 같으면 -> 문자열 전체를 사전순으로 비교
두 번째 조건이 있어야 abcd, abce같은 n번째 글자가 같아도 정상적으로 정렬된다.
문제 풀이
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> solution(vector<string> strings, int n) {
sort(strings.begin(), strings.end(), [n](string a, string b)
{
if(a[n] != b[n])
return a[n] < b[n];
return a < b;
});
return strings;
}
핵심 포인트
1. sort의 비교함수
sort(시작, 끝, 비교함수);
비교함수는 기본적으로 "A가 B보다 앞에 와야 하면 true"를 반화하는 함수이다.
a[n] < b[n]이 true이면 a가 앞에 오도록 정렬된다.
2. 두 단계 비교 로직
if(a[n] != b[n])
return a[n] < b[n]; // n번째 글자 비교
return a < b; // 같으면 전체 사전순
n번째 글자가 다를 때와 같을 때를 분리해서 처리한다.
a < b는 문자열 전체를 사전순으로 비교한다.
3. 람다 함수 사용 목적
sort의 비교 함수는 매개변수 두 개(a, b)만 받는다.
내가 원하는 n을 추가로 전달할 방법이 없어 람다 함수로 전달해야 한다.
람다 함수?
람다 함수는 이름 없이 한 번만 쓰고 버리는 간단한 함수이다.
C++ 11부터 도입되었고 sort같은 함수에 비교로직을 즉석에서 넘길 때 매우 유용하다.
기본 문법
[캡처](매개변수) { 함수 본문 }
일반 함수와 비교
int idx;
bool compare(string a, string b) {
if(a[idx] != b[idx])
return a[idx] < b[idx];
return a < b;
}
vector<string> solution(vector<string> strings, int n) {
idx = n;
sort(strings.begin(), strings.end(), compare);
return strings;
}
이건 일반함수로 구현했을 때의 정답 코드이다.
람다함수를 이용해서 작성한 코드는 다음과 같다.
vector<string> solution(vector<string> strings, int n) {
sort(strings.begin(), strings.end(), [n](string a, string b) {
if(a[n] != b[n])
return a[n] < b[n];
return a < b;
});
return strings;
}
함수 하나로 깔끔하게 정리할 수 있어 편리하고 간결하다.
람다의 3가지 구성요소
[n] (string a, string b) { ... }
↑ ↑ ↑
캡처 매개변수 함수 본문
1. 캡처
람다 바깥에 있는 변수를 람다 안에서 쓸 수 있게 가져오는 부분이다.
[n] 이라고 쓰면 외부의 n을 값으로 복사해서 람다 안에서 사용할 수 있다.
| 캡처 방식 | 의미 |
| [ ] | 아무것도 캡처 안함 |
| [ n ] | n을 값으로 캡처(복사) |
| [ &n ] | n을 참조로 캡처 (원본 접근) |
| [ = ] | 외부 변수 전부 값으로 캡처 |
| [ & ] | 외부 변수 전부 참조로 캡처 |
2. 매개변수
일반 함수와 동일하게 sort가 두 원소를 비교할 때 이 매개변수로 넘겨준다.
3. 함수 본문
실제 비교 로직을 작성하는 부분이다.
일반 함수와 같이 return으로 값을 반환한다.
람다를 쓰는 이유 정리
- 함수를 한 번만 쓸 때 따로 정의하지 않아도 됨
- 외부 변수를 캡처해서 직접 사용 가능
- 전역 변수를 만들지 않아도 돼서 코드가 깔끔해짐
- sort, find_if, for_each같은 STL 알고리즘 함수와 잘 어울림
'Programmers' 카테고리의 다른 글
| < 프로그래머스 C++ > 두 개 뽑아서 더하기 (0) | 2026.04.24 |
|---|---|
| < 프로그래머스 C++ > K번째 수 (0) | 2026.04.23 |
| <프로그래머스 C++> 숫자 문자열과 영단어 (1) | 2026.04.21 |
| < 프로그래머스 C++ > 시저 암호 (0) | 2026.04.20 |
| < 프로그래머스 > 최소직사각형 (0) | 2026.04.17 |