문제 설명
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
제한사항
- strings는 길이 1 이상, 50이하인 배열입니다.
- strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
- strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
- 모든 strings의 원소의 길이는 n보다 큽니다.
- 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
입출력 예
strings | n | return | 설명 | ||
["sun", "bed", "car"] | 1 | ["car", "bed", "sun"] | "sun", "bed", "car"의 1번 째 인덱스 값은 각각 "u", "e", "a" 입니다. 이를 기준으로 strings를 정렬하면 ["car", "bed", "sun"] 입니다. | ||
["abce", "abcd", "cdx"] | 2 | ["abcd", "abce", "cdx"] | "abce"와 "abcd", "cdx"의 2번째 인덱스 값은 "c", "c", "x" 입니다. 따라서 정렬 후에는 "cdx"가 가장 뒤에 위치합니다. "abce"와 "abcd"는 사전순으로 정렬하면 "abcd"가 우선하므로, 답은 ["abcd", "abce", "cdx"] 입니다. |
문제 풀이
풀이 언어 : C++
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// 전역 변수
int i;
// 정렬 함수
bool compare(string a, string b)
{
if(a[i]==b[i]) // 두 글자가 같다면
{
return a<b; // 그냥 사전순으로 앞선 문자열이 먼저
}
else // 두 글자가 다르다면
{
// a의 i번째 글자가 더 작다면 그대로
// a의 i번째 글자가 더 크다면 순서 바꾸기
return a[i]<b[i];
}
}
vector<string> solution(vector<string> strings, int n) {
vector<string> answer;
i=n; // n값 전역변수 i에 대입
// 정렬
sort(strings.begin(), strings.end(), compare);
answer=strings;
return answer;
}
sort 함수에 대해서 알고 있다면 어렵지 않은 문제였다. sort 함수에서 내가 원하는 기준으로 정렬하고 싶을 때는 맨 마지막 매개변수로 함수를 넣어주면 된다. 일단 n의 값을 함수에서도 사용해야하기 때문에 전역변수 하나를 만들고 값을 공유해준다.
compare 함수로 새로운 기준을 정의하자. 만약 a의 i번째 글자와 b의 i번째 글자가 같다면 그냥 사전순으로 앞선 문자열을 먼저 배치한다. 그리고 두 글자가 다르다면 먼저 들어오는 인수인 a의 i번째 글자가 다를 때는 그대로 두고 반대일 때는 순서가 바뀔 수 있도록 false를 호출하게 한다.
마지막으로 정렬된 strings는 answer로 옮겨주고 반환하면 된다.
참고 사항
sort 정렬 함수는 단순히 오름차순, 내림차순으로만 정렬할 수 있는 것이 아니다. 마지막 매개변수로 정렬 기준이 되는 함수를 넣어주면 그 기준 대로 정렬된다.
bool compare(int a, int b)
{
return a>b; // 오름차순 정렬
}
...
sort(a, a+10, compare);
정렬 기준 함수로 사용될 함수는 반환값은 bool타입에 두 개의 이자를 받아야 한다. 이 때 이 매개변수는 정렬할 값과 데이터 타입이 같아야 한다. a와 b에 값이 순서대로 들어왔을 때 true를 반환하면 그대로, false를 반환하면 둘의 순서가 바뀐다고 생각하면 된다.
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/12915
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
'Code KATA > 알고리즘 코드카타' 카테고리의 다른 글
[2025.01.21] 푸드 파이트 대회 (0) | 2025.01.21 |
---|---|
[2025.01.20] 가장 가까운 같은 글자 (0) | 2025.01.20 |
[2025.01.16] 삼총사 (0) | 2025.01.16 |
[2025.01.15] 시저 암호 (0) | 2025.01.15 |
[2025.01.14] 크기가 작은 부분 문자열 (0) | 2025.01.14 |