300x250

1. 제목

- 프로그래머스(17686) : 2018 KAKAO BLIND RECRUITMENT [3차] 파일명 정렬 

문제 링크 : 코딩테스트 연습 - [3차] 파일명 정렬 | 프로그래머스 스쿨 (programmers.co.kr)


2. 풀이 과정

 

쉽게 풀려고 하면 쉽게 풀 수 있는 쉬운 정렬 문제이지만 제가 푼 방법이 좋은 방법은 아닌 거 같네요.

저는 문제에서 정렬 문제이지만 구현문제처럼 문제에서 요구하는 대로 그대로 풀었어요.

문자열을 Head, Number 부분을 나눠서 저장한 다음 이 둘을 먼저 각각 비교하고 같다면 들어온 순서를 유지했어요.

구조체를 만들어서 작업을 했는데 

struct File
{
	string fullName;
	string head;
	int number;
	int inputNumber;
};

그냥 처음부터 들어온 문자열을 그대로 저장하는 fullName 변수

숫자를 만나기 전까지를 저장할 head 변수

head 이후에 숫자를 저장하는 number 변수

마지막으로 들어온 순서를 유지하기 위해 들어온 순서를 기억하는 inputNumber 변수 에요.

 

처음에 입력으로 받는 files 벡터를 순회하며 fullName을 바로 저장해요.

for (auto file : files)
{
    File tempFile;
    tempFile.fullName = file;
}

 

이다음부터 file 문자열의 index를 돌며 head 부분을 분리해 냈어요.

int idx = 0;
for (; idx < file.size(); idx++)
{
    // 문자열 체크
    if (!IsNumber(file[idx]))
    {
        if (file[idx] >= 'A' && file[idx] <= 'Z')
            tempFile.head += (file[idx] + 32);
        else
            tempFile.head += file[idx];
    }
    else
    {
        break;
    }
}

 

그다음 number 부분을 분리하기 위해 숫자가 아닌 문자를 만날 때까지 strNumber 임시 변수에 넣어놓고 stoi() 함수로 문자를 숫자로 바꿔 저장한 후에 tempFile을 sortFiles 벡터에 넣어 줘요.

string strNumber;
for (; idx < file.size(); idx++)
{
    if (IsNumber(file[idx]))
        strNumber += file[idx];
    else
        break;
}
tempFile.number = stoi(strNumber);
tempFile.inputNumber = cnt;

cnt++;
sortFiles.push_back(tempFile);

 

마지막으로 sortFiles를 정렬한 후에 fullName만 따로 빼서 return 하면 정답처리가 돼요.

bool Compare(File file1, File file2)
{
	// 헤드 먼저 비교
	if (file1.head > file2.head)
		return false;
	else if (file1.head < file2.head)
		return true;

	// 헤드가 같다면 number 비교
	if (file1.number > file2.number)
		return false;
	else if (file1.number < file2.number)
		return true;

	// number 까지 같다면 들어온 순서 유지
	return file1.inputNumber < file2.inputNumber;
}

3. 함수 설명

bool Compare(File file1, File file2)

문제에서 요구하는 정렬 순서를 정의하기 위한 함수예요.

 

bool IsNumber(char c)

해당 문자가 숫자인지 체크하는 함수예요.


4. 코드

#include <algorithm>
#include <string>
#include <vector>

using namespace std;

struct File
{
	string fullName;
	string head;
	int number;
	int inputNumber;
};

bool Compare(File file1, File file2)
{
	// 헤드 먼저 비교
	if (file1.head > file2.head)
		return false;
	else if (file1.head < file2.head)
		return true;

	// 헤드가 같다면 number 비교
	if (file1.number > file2.number)
		return false;
	else if (file1.number < file2.number)
		return true;

	// number 까지 같다면 들어온 순서 유지
	return file1.inputNumber < file2.inputNumber;
}

// 문자가 숫자인지 체크하는 함수
bool IsNumber(char c)
{
	if (c >= '0' && c <= '9')
		return true;
	else
		return false;
}

vector<string> solution(vector<string> files)
{
	vector<File> sortFiles;
	vector<string> answer;

	int cnt = 0;
	for (auto file : files)
	{
		File tempFile;
		tempFile.fullName = file;

		int idx = 0;
		for (; idx < file.size(); idx++)
		{
			// 문자열 체크
			if (!IsNumber(file[idx]))
			{
				if (file[idx] >= 'A' && file[idx] <= 'Z')
					tempFile.head += (file[idx] + 32);
				else
					tempFile.head += file[idx];
			}
			else
			{
				break;
			}
		}

		string strNumber;
		for (; idx < file.size(); idx++)
		{
			if (IsNumber(file[idx]))
				strNumber += file[idx];
			else
				break;
		}
		tempFile.number = stoi(strNumber);
		tempFile.inputNumber = cnt;


		cnt++;
		sortFiles.push_back(tempFile);
	}
	

	sort(sortFiles.begin(), sortFiles.end(), Compare);

	for (auto sortFile : sortFiles)
		answer.push_back(sortFile.fullName);

	return answer;
}
300x250