[백준/BOJ] 백준 20210번 : 파일 탐색기
2021. 3. 25. 14:48ㆍ알고리즘 문제풀이
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";
}
}
'알고리즘 문제풀이' 카테고리의 다른 글
[백준/BOJ] 백준 20292번 : 컨설팅 (0) | 2021.03.25 |
---|---|
[백준/BOJ] 백준 17092번 : 색칠 공부 (0) | 2021.03.25 |
[백준/BOJ] 백준 15999번 : 뒤집기 (0) | 2021.03.25 |
[백준/BOJ] 백준 15997번 : 승부 예측 (0) | 2021.03.25 |
[백준/BOJ] 백준 1035번 : 조각 움직이기 (0) | 2021.03.25 |