본문 바로가기
알고리즘 문제풀이

[프로그래머스] 알고리즘 74일차 : 문자열 내 마음대로 정렬하기 (C++ 커스텀 정렬)

by SiO2whocode 2021. 1. 28.
728x90

programmers.co.kr/learn/courses/30/lessons/12915?language=cpp

 

코딩테스트 연습 - 문자열 내 마음대로 정렬하기

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 [sun, bed, car]이고 n이 1이면 각 단어의 인덱스 1

programmers.co.kr

C++ 문자열 | 정렬 

문자열의 특정 인덱스의 값을 기준으로 정렬하라는 문제

 

접근 방법

C++ STL의 sort함수 인자로 내가 정의한 compare함수를 전달해서 풀었다.

compare함수 안에서는 해당 인덱스의 문자 값이 같을때는 문자열 전체를 비교해서 리턴하고

같지 않은 경우는 그냥 인덱스의 문자 값을 비교했다.

 

sort에서 compare 오랜만에 써봐서 헷갈렸던 점

- compare 함수가 true를 반환하면 정렬하지 않는다. (이미 그렇게 정렬되어 있음)

- compare 함수가 false를 반환하면 정렬한다.

따라서 내가 정렬하고자 하는 기준에 맞으면 true를 리턴하고 아니라면 false를 리턴하면 된다.

 

string.compare() 헷갈렸던 점

- a.compare(b) 에서

a < b 이면 -1 => 사전순

a == b 이면 0

a > b 이면 1

 

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

using namespace std;
int m;
bool mycompare(string s1, string s2){
    if(s1[m] == s2[m]){
        return s1.compare(s2) < 0 ;
    }else{
        return s1[m]<s2[m];
    }
}
vector<string> solution(vector<string> strings, int n) {
    m = n;
    vector<string> answer = strings;
    sort(answer.begin(), answer.end(), mycompare);
    return answer;
}

* 56분 걸린 변명

처음엔 정렬함수 자체를 정의해서 풀려고 했지만 같은 값이 여러개일 때도 처리를 해줘야해서

compare함수를 쓰는게 더 좋겠다고 생각했다. 

그래서 java로 풀어보려고 했지만 comparator 재정의하고 오버라이딩 하는 과정을

IDE가 아니라 프로그래머스 상에서 하려니까 너무 낯설어서..자바 책을 다시 봐야겠다는 것을 깨닫고 다시 C++로 돌아왔다. 

728x90