컨텐츠 검색
[프로그래머스/Day 8] 문자열 내 마음대로 정렬하기 - map, vector, 람다식

2026. 1. 10. 11:50알고리즘

1. 문제 접근

  • 정렬 1순위: 각 문자열의 n번째 문자 오름차순
    • map에 넣으면 해결
  • 정렬 2순위: 사전순

→ 우선순위가 높을 수록 나중에 적용해야 한다.

2. 의사코드

  1. 벡터에서 각 문자열(key)와 n번째 문자(value)를 map에 넣는다.
    • map은 자동으로 오름차순 정렬하므로, 정렬 1순위 통과
  2. map에서 n번째 문자인 value를 받아 오름차순해서 그 순서대로 결과에 문자열을 넣는다.
    • 각 문자열의 n번째 문자 오름차순을 함으로서 우선순위를 지킴.

  1. 2번 과정 풀다가 생각난건데, map<char, vector<string>> 이렇게 한다면?
    • 아래와 같이 넣어주고 vector 오름차순 정렬 후, 순서대로 결과에 더해주면 끝.
{a: [car]} {e: [bed]} {u: [sun]}
{c: [abce, abcd]} {x: [cdx]}

3. 내 풀이

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

using namespace std;

vector<string> solution(vector<string> strings, int n) {
    vector<string> answer;
    map<char, vector<string>> orderedMap;

    for(string str : strings)
    {
        orderedMap[str[n]].push_back(str);
    }

    for(auto& pair : orderedMap)
    {
        sort(pair.second.begin(), pair.second.end());

        for(string str : pair.second)
        {
            answer.push_back(str);
        }
    }

    return answer;
}
  • 정렬 우선순위를 나눠, map이 자동 오름차순 정렬되는 것을 이용해 n번째 문자 오름차순을 1순위로 했다.
  • 그리고 n번째 문자가 동일한 경우, vector 내에 해당되는 문자열을 추가해 오름차순 정렬하여 결과에 더했다.

4. 다른 사람의 풀이

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

using namespace std;

vector<string> solution(vector<string> strings, int n)
{
    // [n]: 바깥에 있는 변수 n을 복사해서 안에다 사용하겠다
    sort(strings.begin(), strings.end(), [n](string a, string b) {
        return a[n] == b[n] ? a < b : a[n] < b[n];
    });

    return strings;
}
  • 람다식을 이용해서 두 문자열이 같을 경우에는 사전 순으로 하고, 같지 않을 때는 인덱스 순서로 하여 단번에 문제를 해결했다.