🧠 알고리즘 TIL

2025.05.30

📋 문제 1: 문자열 내 마음대로 정렬하기

문자열 배열에서 각 문자열의 특정 인덱스 문자를 기준으로 정렬하는 문제를 해결함. n번째 문자 기준으로 오름차순 정렬하되, 같은 문자일 경우 사전순으로 정렬하는 로직이 핵심임.

**사용한 주요 함수 및 자료구조**

  • #include <vector> – 동적 배열을 위한 라이브러리
  • #include <string> – 문자열 조작을 위한 라이브러리
  • #include <algorithm> – 정렬 함수를 위한 라이브러리
  • std::sort() – 커스텀 비교 함수와 함께 정렬 수행
  • 람다 함수 – 정렬 기준을 정의하는 비교 함수
  • 문자열 인덱싱 – 특정 위치의 문자 접근

**최종 코드**

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

vector<string> solution(vector<string> strings, int n) {
    vector<string> answer = strings;
    
    sort(answer.begin(), answer.end(), [&](const string& a, const string& b) {
        if (a[n] != b[n]) {
            return a[n] < b[n];
        }
        return a < b;
    });
    
    return answer;
}

📋 문제 2: K번째수

배열의 특정 구간을 자르고 정렬한 후 k번째 원소를 찾는 문제를 해결함. 여러 개의 명령어가 주어질 때 각각에 대해 연산을 수행하여 결과를 배열로 반환하는 로직이 핵심임.

**사용한 주요 함수 및 자료구조**

  • #include <vector> – 동적 배열을 위한 라이브러리
  • #include <algorithm> – 정렬 함수를 위한 라이브러리
  • 벡터 생성자 – 특정 범위의 원소들로 새로운 벡터 생성
  • std::sort() – 벡터를 오름차순으로 정렬
  • vector::push_back() – 결과를 배열에 추가

**최종 코드**

#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> array, vector<vector<int>> commands)
{
    vector<int> answer;

    for (int i = 0; i < commands.size(); i++)
    {
        vector<int> temp(array.begin() + commands[i][0] - 1, array.begin() + commands[i][1]);
        
        sort(temp.begin(), temp.end());
        
        answer.push_back(temp[commands[i][2] - 1]);
    }
    
    return answer;
}

**배운 점**

  • 람다 함수의 반환 조건: sort() 함수의 비교 함수에서 true를 반환하면 첫 번째 인자가 앞에 위치함. 모든 경우에 대해 반환값을 명시해야 함
  • 벡터 범위 생성: vector<int> temp(시작반복자, 끝반복자)에서 끝반복자는 포함되지 않음 (반열린 구간)
  • 1-based vs 0-based 인덱싱: 문제에서 주어진 인덱스가 1부터 시작하면 배열 접근 시 -1을 해주어야 함
  • 람다 함수 캡처: [&]로 외부 변수를 참조로 캡처하여 사용할 수 있음
  • 커스텀 정렬: 여러 조건의 정렬이 필요할 때는 우선순위가 높은 조건부터 체크하고 같을 때 다음 조건을 적용함