< 프로그래머스 C++ > 문자열 내 마음대로 정렬하기

2026. 4. 22. 10:09Programmers


문제 해석

정렬 기준이 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 알고리즘 함수와 잘 어울림