🧠 알고리즘 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을 해주어야 함
- 람다 함수 캡처:
[&]로 외부 변수를 참조로 캡처하여 사용할 수 있음 - 커스텀 정렬: 여러 조건의 정렬이 필요할 때는 우선순위가 높은 조건부터 체크하고 같을 때 다음 조건을 적용함