programmers.co.kr/learn/courses/30/lessons/17686
코딩테스트 연습 - [3차] 파일명 정렬
파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램��
programmers.co.kr
문제요약
- head, number, tail 세개의 부분을 주어진 조건에 맞춰 파일을 정렬하는 문제
- head는 문자만 가능하고, 적어도 1개이상, 대소문자 관계없다.
- number는 처음으로 나오는 숫자 덩어리(이후 문자 나왔다가 나온 숫자는 tail임), 0100-> 100으로 처리
- tail은 그 외 나머지 문자열
생각
- 최근에 비교함수를 이용해서 정렬하는 문제를 풀어서 그런지 바로 이를 이용해서 풀어야겠다 생각했다.
알고리즘 설계
- 구조체를 이용하여 name(변경전 문자열), head, number를 담은 fileData를 정의하였다.
- 우선 files의 크기만큼 for문을 반복해서 각각의 파일명에서 head,number의 인덱스를 파싱했다.
- head는 대소문자 상관없이 정렬이므로 tolower를 이용하여 구조체에 넣어주었다.
- number는 stoi를 이용하여 넣어주었다.
- name을 넣어준 이유는 head를 tolower로 넣어주었기때문에 나중에 기존의 문자열을 알아내기 위함이다.
- compare비교함수를 이용하여 stable_sort하였다.
소스코드
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct {
string name;
string head;
int number;
}fileData;
bool compare(fileData f1, fileData f2) {
if (f1.head == f2.head) {
return f1.number < f2.number;
}
else {
return f1.head < f2.head;
}
}
vector<string> solution(vector<string> files) {
vector<string> answer;
vector<fileData> v;
int idx1, idx2;
for (int i = 0; i < files.size(); i++) {
idx1, idx2 = 0;
bool flag = false;
for (int j = 0; j < files[i].size(); j++) {
if (flag) {
if (!(files[i][j] >= '0' && files[i][j] <= '9')) {
idx2 = j;
break;
}
}
else {
if (files[i][j] >= '0' && files[i][j] <= '9') {
idx1 = j;
flag = true;
}
}
}
string a = files[i].substr(0, idx1);
string b = files[i].substr(idx1, idx2 - idx1);
for (int j = 0; j < a.size(); j++)
a[j] = tolower(a[j]);
v.push_back({files[i],a,stoi(b)});
}
stable_sort(v.begin(), v.end(), compare);
for (int i = 0; i < v.size(); i++)
answer.push_back(v[i].name);
return answer;
}
알아둘 점
- stable_sort를 이용하면 같은값은 주어진 인덱스 순으로 정렬된다.
- string s1= "0100" 을 stoi하면 100으로 변환된다.
- compare함수 익숙하게하기