링크: https://school.programmers.co.kr/learn/courses/30/lessons/12915?language=cpp
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
1. 문제 접근
이 문제는 문자열 배열 strings를 정렬하는 문제이다. 단, 일반적인 사전순 정렬이 아니라 각 문자열의 n번째 문자를 기준으로 정렬해야 한다.
정렬 조건은 다음과 같다.
- 각 문자열의 n번째 문자를 기준으로 오름차순 정렬한다.
- 만약 n번째 문자가 같다면, 문자열 전체를 사전순으로 정렬한다.
2. 풀이
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int x;
bool comp(string a, string b) {
if (a[x] != b[x]) {
return a[x] < b[x];
}
return a < b;
}
vector<string> solution(vector<string> strings, int n) {
vector<string> answer;
x = n;
sort(strings.begin(), strings.end(), comp);
// sort함수 커스터 마이징 idea
// sort 함수에 comp는 직접 만든 비교함수이다.
// comp 함수 기준에 따라 정렬이 됨
answer = strings;
return answer;
}
3. 문법 설명 - sort 함수 커스터마이징
- C++의 sort() 함수는 기본적으로 오름차순 정렬을 수행한다.
sort(v.begin(), v.end()); sort(v.begin(), v.end(), comp); // 정렬 기준을 직접 새롭게 만들고 싶다면 세 번째 인자에 비교함수를 넣어서 // 새로운 정렬기준 sort함수 생성 가능 // comp는 비교함수(정렬기준) 함수이다. - 여기서 comp 함수는 두 값을 비교해서 => 앞에 와야 하는 조건을 true로 반환해야 한다.
bool comp(string a, string b) //이 함수는 다음과 같이 해석하면 된다. a가 b보다 앞에 와야 하면 true 아니면 false - 비교함수는 다음과 같다.
bool comp(string a, string b) { if (a[x] != b[x]) { // 먼저 두 문자열의 x번째 문자를 비교한다. return a[x] < b[x]; // 두 문자 다르고 // 결과가 true 라면, 더 작은 문자 열 앞에둔다 } return a < b; }- 예를들어
a = "car" b = "bed" x = 1 //비교대상은 아래와 같다. a[1] = 'a' b[1] = 'e' //결과 예시 'a' < 'e'는 true이므로 "car"가 "bed"보다 앞에 온다. //x문자가 같다면 만약 x번째 문자가 같다면 전체 문자열을 사전순으로 비교 return a < b;
- 예를들어
- comp 함수 일반화
//오름차순 bool comp(자료형 a, 자료형 b){ return a<b; // a가 b보다 작으면, a를 앞에 둔다. } //내림차순 bool comp(자료형 a, 자료형 b){ return a>b; // a가 b보다 크면, a를 앞에 둔다. } //즉, return 값이 true 이면 => a가 앞에 온다.
4. 최종 요약
- 이 문제의 핵심은 sort()의 세 번째 인자로 사용자 정의 비교 함수를 넣는 것이다.
sort(strings.begin(), strings.end(), comp); - 비교 함수는 다음 기준으로 작성한다.
bool comp(string a, string b) { if (a[x] != b[x]) { return a[x] < b[x]; // true 이면 a가 b보다 앞에 온다. } return a < b; }
comp(a, b)는 “a를 b보다 앞에 둘 것인가?”를 판단하는 함수이다.
true를 반환하면 a가 b보다 앞에 오고, false를 반환하면 a가 b보다 앞에 오지 않는다.'코테 정리 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스/C++] 추억 점수 (Lv.1) (0) | 2026.06.03 |
|---|---|
| [프로그래머스/C++] [1차]비밀지도 (Lv.1) (0) | 2026.06.02 |
| [프로그래머스/C++] 명예의 전당 (Lv.1) (0) | 2026.05.22 |
| [프로그래머스/C++] 숫자 문자열과 영단어 (Lv.1) (0) | 2026.05.21 |
| [프로그래머스/C++] 두 개 뽑아서 더하기 (Lv.1) (0) | 2026.05.20 |
