본문 바로가기
#알고리즘 [Algorithm]/Problem

[프로그래머스 - 정렬] 파일명 정렬 (for kakao)

by cy_mos 2019. 8. 14.
반응형

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


📄 [정렬] 파일명 정렬 C++ Source Code

#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;

#define STR_FILE_PAIR pair<string, File>

const string removeZero(string number) {

	auto end = number.begin();
	while (number.end() != end && *end == 48) { end++; }

	// 문자열 앞에 숫자 0을 제거한다.
	if (number.begin() != end) {
		number.erase(number.begin(), end);
	}

	return number.empty() ? "0" : number;
}

const bool isDigit(const char letter) {
	return letter >= 48 && letter <= 57;
}

typedef struct file {

	string head;
	string number;

	file(string name) {

		string::iterator str_iter;

		for (auto begin = name.begin(); begin != name.end(); begin++) {
			const auto letter = *begin;
			// HEAD는 숫자가 아닌 문자로 이루어져 있으며, 최소한 한 글자 이상이다.
			if (isDigit(letter)) { str_iter = begin; break; }
		}

		// 문자열 비교 시 대소문자를 구분 하지 않는다.
		this->head = string(name.begin(), str_iter);
		std::transform(this->head.begin(), this->head.end(), this->head.begin(), ::toupper);

		// NUMBER는 한 글자에서 최대 다섯 글자 사이의 연속된 숫자로 이루어져 있으며, 앞쪽에 0이 올 수 있다. 0부터 99999 사이의 숫자로, 00000이나 0101 등도 가능하다.
		for (; str_iter != name.end(); str_iter++) {
			const auto letter = *str_iter;

			/* 
				파일명의 HEAD 부분이 대소문자 차이 외에는 같을 경우, NUMBER의 숫자 순으로 정렬한다. 
				9 < 10 < 0011 < 012 < 13 < 014 순으로 정렬된다. 
				숫자 앞의 0은 무시되며, 012와 12는 정렬 시에 같은 같은 값으로 처리된다.
			*/
			if ( isDigit(letter) && this->number.size() < 5 ) { 
				this->number += letter; 
				// ※ CAPTION - NUMBER는 한 글자에서 최대 다섯 글자 사이의 연속된 숫자이다.
			} else {
				break;
			}
		}

		this->number = removeZero(this->number);
	}

} File;

const bool compare(const STR_FILE_PAIR & left, const STR_FILE_PAIR & right) {
	const pair<File, File> target = std::make_pair(left.second, right.second);

	if (target.first.head.compare(target.second.head) == 0) {
		return std::stoi(target.first.number) < std::stoi(target.second.number);
	} else {
		return target.first.head < target.second.head;
	}
}

vector<string> solution(vector<string> files) {

	vector<STR_FILE_PAIR> bucket;
	for (const auto val : files) {
		const STR_FILE_PAIR item = std::make_pair(val, File(val));
		bucket.push_back(item);
	}
	
	std::stable_sort(bucket.begin(), bucket.end(), compare);

	vector<string> answer;
	for (const auto val : bucket) {
		answer.push_back(val.first);
	}

	return answer;
}

🚀 REFERENCE

 

코딩테스트 연습 - [3차] 파일명 정렬 | 프로그래머스

파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램의 과거 버전을 모두 담고 있어, 이름 순으로 정렬된 파일 목록은 보기가 불편했다. 파일을 이름 순으로 정렬하면 나중에 만들어진 ver-10.zip이 ver-9.zip보다 먼저 표시되기 때문이다. 버전 번호 외에도 숫자가 포함된 파일 목록은 여러 면에서 관리하기 불편했다. 예

programmers.co.kr

 

카카오 신입 공채 3차 코딩 테스트 문제 해설

블라인드 채용으로 관심을 모은 카카오 신입 공채의 세 번째 테스트가 지난 10월 29일(일), 오후 2시부터 6시까지 네 시간에 걸쳐 오프라인으로 치러졌습니다. 두 차례의 온라인 테스트를 통과한 지원자들이 한 자리에 모여 다시 한번 실력을 검증하는 자리를 가졌습니다. 세 번째 관문 오프라인 코딩 테스트는 온라인 코딩 테스트와는 사뭇 달랐습니다. 1차와 2차 코딩 테스트에서 상위권의 우수한 성적을 거뒀던 지원자가 3차 코딩 테스트의 관문을 통과하지 못한 경

tech.kakao.com

 

ChangYeop-Yang/Study-Algorithm

수학과 컴퓨터 과학, 언어학 또는 관련 분야에서 어떠한 문제를 해결하기 위해 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 것을 말한다. 알고리즘은 연산, 데이터 진행 또는 자동화된 추론을 수행한다. - ChangYeop-Yang/Study-Algorithm

github.com

 

반응형

댓글