[백준/BOJ] 백준 20210번 : 파일 탐색기

2021. 3. 25. 14:48알고리즘 문제풀이

www.acmicpc.net/problem/20210

 

20210번: 파일 탐색기

첫 줄에 문자열의 개수 N(2 ≤ N ≤ 10,000)이 주어진다. 그 다음 N줄에 정렬할 문자열이 한 줄에 하나씩 주어진다. 모든 문자열의 길이는 100 이하이며, 알파벳 대소문자와 숫자로만 이루어져 있다.

www.acmicpc.net

vector<string> info[10000];에 입력된 문자열을 단어로 나눠서 저장을 한다, 그리고 정렬을 할 때 쓰는 비교 함수를 bool cmp(vector<string>& a, vector<string>& b) 이렇게 작성해서 문제를 해결했다.

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
#include <deque>
#include <string>
#include <map>
#include <cmath>
using namespace std;

int n;
vector<string> info[10000];

//숫자인지 문자인지 확인
int Number_Alpha(string& check)
{
	//숫자일때
	if (check[0] >= '0' && check[0] <= '9')
		return 0;

	//문자일때
	return 1;
}

bool cmp(vector<string>& a, vector<string>& b)
{
	int len = min(a.size(), b.size());

	for (int i = 0; i < len; i++)
	{
		//앞에는 숫자 뒤에는 문자일때
		if (Number_Alpha(a[i]) == 0 && Number_Alpha(b[i]) == 1)
		{
			return true;
		}

		//앞에는 문자 뒤에는 숫자일때
		else if (Number_Alpha(a[i]) == 1 && Number_Alpha(b[i]) == 0)
		{
			return false;
		}

		//둘다 숫자일때
		else if (Number_Alpha(a[i]) == 0 && Number_Alpha(b[i]) == 0)
		{
			int a_front_zero_cnt = 0;
			int b_front_zero_cnt = 0;
			string a_real = "";
			string b_real = "";

			for (int j = 0; j < a[i].size(); j++)
			{
				if (a[i][j] == '0')
					a_front_zero_cnt++;
				else
				{
					a_real = a[i].substr(a_front_zero_cnt, a[i].size() - a_front_zero_cnt);
					break;
				}
			}

			for (int j = 0; j < b[i].size(); j++)
			{
				if (b[i][j] == '0')
					b_front_zero_cnt++;
				else
				{
					b_real = b[i].substr(b_front_zero_cnt, b[i].size() - b_front_zero_cnt);
					break;
				}
			}

			//같은 값을 가지는 숫자일때
			if (a_real == b_real)
			{
				//앞의 0의 개수가 적은것이 앞에온다
				if (a_front_zero_cnt < b_front_zero_cnt)
					return true;

				else if (a_front_zero_cnt > b_front_zero_cnt)
					return false;
			}

			//다른 값을 가지는 숫자일때
			else
			{

				if (a_real.size() < b_real.size())
					return true;

				else if (a_real.size() > b_real.size())
					return false;

				else //두 숫자가 같은 자리수일때
				{
					for (int j = 0; j < a_real.size(); j++)
					{
						if (a_real[j] < b_real[j])
							return true;

						else if (a_real[j] > b_real[j])
							return false;
					}
				}
			}

		}

		//둘다 문자일때
		else if (Number_Alpha(a[i]) == 1 && Number_Alpha(b[i]) == 1)
		{

			int i_len = min(a[i].size(), b[i].size());

			for (int j = 0; j < i_len; j++)
			{
				if (tolower(a[i][j]) < tolower(b[i][j]))
					return true;

				else if (tolower(a[i][j]) > tolower(b[i][j]))
					return false;

				else
				{
					if ((a[i][j] >= 'A' && a[i][j] <= 'Z') && (b[i][j] >= 'a' && b[i][j] <= 'z'))
						return true;
					else if ((a[i][j] >= 'a' && a[i][j] <= 'z') && (b[i][j] >= 'A' && b[i][j] <= 'Z'))
						return false;
				}
			}

			if (a[i].size() < b[i].size())
				return true;

			else if (a[i].size() > b[i].size())
				return false;
		}
	}

	if (a.size() < b.size())
		return true;

	else
		return false;

	return true;
}

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	cin >> n;

	for (int i = 0; i < n; i++)
	{
		string input;
		cin >> input;

		string temp = "";
		bool number = false;
		for (int j = 0; j < input.size(); j++)
		{
			if ((input[j] >= 'a' && input[j] <= 'z') || (input[j] >= 'A' && input[j] <= 'Z'))
			{
				if (temp == "")
				{
					temp += input[j];
				}

				else if (number == true) //숫자를 저장중 이었다면
				{
					info[i].push_back(temp);

					temp = "";
					temp += input[j];
				}

				else if (number == false) //영어 단어를 저장중이었다면
				{
					temp += input[j];

				}

				number = false;
			}

			else if (input[j] >= '0' && input[j] <= '9')
			{
				if (temp == "")
				{
					temp += input[j];
				}

				else if (number == true) //숫자를 저장중 이었다면
				{
					temp += input[j];
				}

				else if (number == false) //영어 단어를 저장중이었다면
				{
					info[i].push_back(temp);

					temp = "";
					temp += input[j];
				}

				number = true;
			}

			if (j == input.size() - 1 && temp.size() != 0)
				info[i].push_back(temp);
		}

	}

	sort(info, info + n, cmp);

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < info[i].size(); j++)
			cout << info[i][j];

		cout << "\n";
	}

}