본문 바로가기
알고리즘/프로그래머스

[C++] 문자열 내 마음대로 정렬하기(연습문제)

by 민-Zero 2020. 3. 22.

문제는 위와 같다. 목표는 입력받은 문자열을 원소로 가지는 배열 strings를 입력받은 인덱스 번호 n번째 문자를 기준으로 오름차순 정렬한 배열을 반환한다. 주의할 점은 만약 기준 문자가 같을 경우 해당 문자는 사전순으로 배열해야 한다.

 

strings가 [sun, bed, car]이고 n이 1이라면 인덱스 번호 1인 문자 u, e, a를 기준으로 오름차순 정렬하므로 a, e, u 순서가 되므로 반환되는 배열은 [car, bed, sun]이 된다.

strings가 [abc, abe, abd]이고 n이 1이라면 기준이 되는 문자들이 b로 모두 같다 따라서 이때 기준 문자가 같은 문자열들은 사전순으로 정렬해야 하므로 abc, abd, abe 가된다.

 

설계 및 구현

구현을 위해 주어진 함수는 string타입을 가지는 벡터를 반환값으로 가지고 매개변수로 정렬을 수행해야 하는 strings 벡터와 기준 인덱스인 정수 n을 가진다. 파이썬에서는 sorted()의 key 매개변수를 사용하여 정렬의 기준을 설정해 주었다. 마찬가지로 C++에서도 algorithm헤더에 존재하는 sort(s, e, compare) 함수를 사용해 비교할 기준을 설정할 수 있다. 비교 기준을 설정하는 compare 또한 함수를 매개변수로 받으며 반환타입은 bool타입이어야 한다.

 

bool compare(매개변수 a, 매개변수 b) {

    return (a가 b보다 앞에 올 조건);

}

 

함수명이나 매개변수명이 위에 작성한 것과 같게 작성할 필요는 없지만 비교를 위한 함수의 형식은 맞추어야 한다.

 

비교를 위한 기준인 compare함수를 n번째 인덱스를 비교 기준으로 사용하기 위해 idx라는 전역변수를 생성하여 사용했다. solution 함수에서 idx의 값을 입력받은 n의 값을 넣어 주어진 인덱스 번호를 기준으로 수행하게 되며 a가 b보다 앞에 올 조건은 오름차순이기 때문에 a[idx] < b[idx]가 된다. 만약 비교하는 기준 문자가 같을 경우 사전순으로 비교해야 하기 때문에 해당 인덱스의 문자가 아닌 문자열 자체를 비교하도록 a < b를 통해 순서를 정하도록 해결했다.

 

댓글