링크: https://school.programmers.co.kr/learn/courses/30/lessons/12915?language=cpp

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

1. 문제 접근

이 문제는 문자열 배열 strings를 정렬하는 문제이다. 단, 일반적인 사전순 정렬이 아니라 각 문자열의 n번째 문자를 기준으로 정렬해야 한다.

정렬 조건은 다음과 같다.

  1. 각 문자열의 n번째 문자를 기준으로 오름차순 정렬한다.
  2. 만약 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보다 앞에 오지 않는다.

+ Recent posts