굥뷰를 햡시댜
[2018_Blind_Kakao] 파일명 정렬 본문
https://programmers.co.kr/learn/courses/30/lessons/17686
코딩테스트 연습 - [3차] 파일명 정렬
파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램
programmers.co.kr
문자열 정렬 문제
C++의 경우 문자열 정렬 문제를 풀 때 STL의 sort를 사용한다면,
sort보다 stable_sort를 사용하는게 좋다
이유는 다음과 같다.
여기서 sort는 불안전한 정렬, stable_sort는 말 그대로 안정된 정렬이다.
sort는 퀵소트 기반, stable_sort는 머지소트 기반이다.
sort는 순서 보장이 안되지만 stable_sort는 순서 보장이 된다.
두 정렬의 차이를 이 문제의 테스트 케이스를 예시로 들면,
img01, img1의 경우 sort는 (img01, img1), (img1,img01) 이 두 경우중 하나를 반환한다.
즉, 01과 1을 같다고 생각하여 전자가 올 수 있고 혹은 후자가 올 수도 있다.
stable_sort는 순서를 보장하여 정렬한다.
문제 접근 방식은 숫자가 나오기 이전 까지 head, 숫자 영역은 number, 그 이후 영역은 tail로 놓고 풀었다.
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
bool stringCmp(pair<pair<pair<string, string>, string>, string> s1, pair<pair<pair<string, string>, string>, string> s2) {
if (s1.first.first.first == s2.first.first.first) {
return stoi(s1.first.first.second) < stoi(s2.first.first.second);
}
else
return s1.first.first.first < s2.first.first.first;
}
vector<string> solution(vector<string> files) {
vector<string> answer;
vector<pair<pair<pair<string, string>, string>, string>> strLine;
for (int i = 0; i < files.size(); i++) {
string temp = files[i];
string head, number, tail;
int num = 0;
for (int j = 0; j < temp.length(); j++) {
if (temp[j] >= 48 && temp[j] <= 57) {
num = j;
break;
}
else {
head += tolower(temp[j]);
}
}
for (int j = num; j < temp.length(); j++) {
if (temp[j] >= 48 && temp[j] <= 57) {
number += temp[j];
}
else {
num = j;
break;
}
}
tail = temp.substr(num);
strLine.push_back({ { {head, number}, tail }, temp });
}
stable_sort(strLine.begin(), strLine.end(), stringCmp);
for (int i = 0; i < strLine.size(); i++)
answer.push_back(strLine[i].second);
return answer;
}
Comments