반응형
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/17686#
문제 풀이
각각의 파일을 돌며 숫자가 나오기 전까진 head, 숫자가 나온 뒤부터는 number로 넣어준다.
숫자의 크기는 최대 5이다.
모두 추출하였으면 pair형태의 string, int로 넣어주고 다시 pair를 선언하여 앞에는 인덱스를 붙여준다.
즉, pair<int, pair<string, int> >의 형태가 된다.
다음으로, 정렬을 위한 compare 함수를 만들어준다. 정렬 순서는 head, number, index 순서이다.
이 때, sort 대신 stable_sort를 사용해야 에러가 나지 않는다.
정렬되었으면 정렬된 인덱스 순으로 answer에 push해준다.
코드
#include <bits/stdc++.h>
using namespace std;
bool cmp(pair<int, pair<string, int> > a, pair<int, pair<string, int> > b){
if(a.second.first < b.second.first) return true;
else if(a.second.first == b.second.first){
return a.second.second < b.second.second;
}
else return a.first < b.first;
}
vector<string> solution(vector<string> files) {
vector<string> answer;
vector<pair<int, pair<string, int> > > v;
for(int i=0; i<files.size(); i++){
string head = "";
int idx = 0;
int num = 0;
for(int j=0; j<files[i].size(); j++){
if(isdigit(files[i][j])){
idx = j;
break;
}
else head += tolower(files[i][j]);
}
string tmp = "";
for(int j=idx; j<files[i].size(); j++){
if(('0' <= files[i][j] && files[i][j] <= '9') && tmp.size() < 5){
tmp += files[i][j];
}
else break;
}
num = stoi(tmp);
v.push_back({i, {head, num}});
}
stable_sort(v.begin(), v.end(), cmp);
for(int i=0; i<v.size(); i++){
answer.push_back(files[v[i].first]);
}
return answer;
}
시행착오
위의 코드에서 num = stoi(tmp)가 있다.
처음엔 이 코드를 else문 안에 포함시켰었는데, 이렇게 되면 오류가 발생한다.
예를 들어, "A00123"같은 경우 else문을 거치지 않고 for문을 빠져나오기 때문이다.
반응형
'Programming Solve > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 행렬의 덧셈 / Swift (0) | 2022.04.01 |
---|---|
프로그래머스 - K번째수 / Swift (0) | 2022.03.31 |
프로그래머스 - 이중우선순위큐 / C++ (0) | 2022.03.16 |
프로그래머스 - 디스크 컨트롤러 / C++ (0) | 2022.03.15 |
프로그래머스 - 더 맵게 / C++ (0) | 2022.03.11 |