[프로그래머스] 파일명 정렬

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함수 익숙하게하기

 

 

 

 

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유