N
(프로그래머스 c++ KAKAO)파일명 정렬 본문
파일명을 head, number, tail로 나누고
1. head의 오름차순으로 정렬
2. head가 같다면 number의 오름차순으로 정렬
3. head, number가 같다면 들어온 순서대로 정렬
을 진행해야 한다.
우선 head와 number를 나누도록 한다.
hc는 head check, nc는 number check로 각각 head와 number가 나눠졌는지 확인하기 위한 bool형 변수다.
이중for문을 이용하여 files[i][j]가 '0' ~ '9'가 아닌 부분은 head로 넣어준다.
hc == false라면 아직 head 부분이므로 소문자로 바꿔준 후, 넣어주도록 한다.
'0'~'9'라면 head부분은 끝났기 때문에 hc = true로 바꿔주고, 해당 부분은 number에 더해준다.
hc = true로 바뀌었고, nc는 여전히 false이므로 number를 넣어주면 된다.
문자열 숫자가 아닐 때까지 number에 넣어주고, 숫자가 아닌 경우 break.
이제 한 파일의 head와 number가 나뉘어졌으므로, vector에 넣어주면 된다.
vector<pair<string, pair<string, int>>> v는 head, number, index를 가지는 pair형 vector이다.
v에 넣어주고 hc, nc는 false로 바꿔 다음 file의 이름을 나눠주도록 한다.
모든 file이 v에 들어가게 되면 sort를 하도록 한다.
이때, 기본적인 sort함수는 불안정하다는 글을 보았다.
또한 sort함수를 이용하여 제출하면 대부분 케이스가 실패가 된다.
그래서 stable_sort함수를 사용하였다.
sort와 마찬가지로 함수를 정의해서 사용할 수 있다.
cmp 함수를 정의.
만약 a.first == b.first라면 head가 같다는 뜻이다.
또한 a.second.first == b.second.first라면 head와 number가 같다는 뜻이므로
들어온 순서대로 처리하도록 한다.
만약 head만 같다면 number를 int형으로 바꿔 숫자의 오름차순으로 정렬을 하도록 한다.
만약 a.first != b.first라면 head의 오름차순으로 정렬을 하면 된다.
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
bool cmp(pair<string, pair<string, int>> a, pair<string, pair<string, int>> b)
{
if(a.first == b.first)
{
if(a.second.first == b.second.first)
return a.second.second < b.second.second;
return stoi(a.second.first) < stoi(b.second.first);
}
else
return a.first < b.first;
}
vector<string> solution(vector<string> files) {
vector<string> answer;
string head = "", number = "";
bool hc = false, nc = false;
vector<pair<string, pair<string, int>>> v;
for(int i = 0; i < files.size(); i++)
{
pair<string, int> p;
for(int j = 0; j < files[i].size(); j++)
{
if(hc == false)
{
if(files[i][j] >= '0' && files[i][j] <= '9')
{
hc = true;
number += files[i][j];
}
else
head += tolower(files[i][j]);
}
else if(hc && nc == false)
{
if(files[i][j] >= '0' && files[i][j] <= '9')
number += files[i][j];
else
break;
}
}
p = make_pair(number, i);
v.push_back(make_pair(head, p));
head = number = "";
hc = nc = false;
}
stable_sort(v.begin(), v.end(), cmp);
for(auto itr : v)
answer.push_back(files[itr.second.second]);
return answer;
}
'프로그래머스 알고리즘 > KAKAO' 카테고리의 다른 글
(프로그래머스 c++ KAKAO)추석 트래픽 (2) | 2020.08.04 |
---|---|
(프로그래머스 c++ KAKAO)징검다리 건너기 (3) | 2020.07.20 |
(프로그래머스 c++ KAKAO)보석 쇼핑 (2) | 2020.07.03 |
(프로그래머스 c++ KAKAO)키패드 누르기 (0) | 2020.07.02 |
(프로그래머스 c++ KAKAO)수식 최대화 (2) | 2020.07.01 |