https://www.acmicpc.net/problem/22232
문제
가희는 jo_test 폴더에 들어와 있습니다. 가희는 jo_test에 있는 파일 N개를 아래 기준에 따라 정렬하려고 합니다.
- 파일명 (FILENAME) 사전순으로
- 파일명 (FILENAME)이 같다면 가희가 설치한 OS에서 인식하는 확장자가 붙은 것이 먼저 나오게
- 1과 2로도 순서를 결정할 수 없다면, 파일 확장자 (EXTENSION) 사전 순으로
파일 N개를 문제에서 설명하는 정렬 기준에 따라 정렬해 주세요. 사전순의 기준은 아스키 코드 순입니다.
입력
첫 번째 줄에 jo_test 폴더에 있는 파일 개수 N과 가희가 설치한 OS에서 인식하는 파일 확장자의 개수 M이 공백으로 구분되어 주어집니다.
2번째 줄부터 N+1번째 줄까지 FILENAME.EXTENSION 형식의 문자열이 주어집니다. 여기서 .은 온점을 의미합니다.
FILENAME은 소문자와 숫자로만, EXTENSION은 소문자로만 이루어져 있습니다.
그 다음 줄 부터 가희가 설치한 OS에서 인식하는 파일 확장자 (EXTENSION) M개가 주어집니다.
출력
기준에 따라 정렬된 결과를 출력해 주세요.
제한
- 1 ≤ N ≤ 2×105
- 1 ≤ M ≤ 2×105
- 파일 확장자와 파일명의 길이는 10을 넘지 않습니다.
- 입력으로 주어지는 FILENAME.EXTENSION 꼴의 N개는 중복되지 않습니다.
- 가희가 설치한 OS에서 인식하는 파일 확장자 M개는 중복되지 않습니다.
문제 풀이
정렬 문제.
문제의 조건에 따라 사용자 정의 정렬을 해주면 된다. boolean 타입의 함수를 만들어 sort() 함수의 세 번째 인자로 넣어주면 사용자 정의 정렬이 가능하다. .을 기준으로 파일명과 확장자 명을 분리하고, 인식하는 확장자인지 확인해야 하므로 set에 저장하고 find()로 확인해주면 된다.
아래는 코드.
더보기
#include <iostream>
#include <algorithm>
#include <string>
#include <set>
using namespace std;
set<string> s;
set<string>::iterator it1;
set<string>::iterator it2;
bool cmp(string s1, string s2)
{
int index1 = s1.find('.');
int index2 = s2.find('.');
string fileName1 = s1.substr(0, index1);
string fileName2 = s2.substr(0, index2);
if (fileName1 < fileName2)
{
return true;
}
else if (fileName1 == fileName2)
{
string s1Ext = s1.substr(index1 + 1);
string s2Ext = s2.substr(index2 + 1);
it1 = s.find(s1Ext);
it2 = s.find(s2Ext);
if (it1 != s.end() && it2 == s.end())
{
return true;
}
else if (it1 == s.end() && it2 != s.end())
{
return false;
}
else
{
return s1Ext < s2Ext;
}
}
else
{
return false;
}
}
int main()
{
cin.tie(NULL);
ios::sync_with_stdio(false);
int N, M;
string ext;
cin >> N >> M;
string* arr = new string[N];
for (int i = 0; i < N; i++)
{
cin >> arr[i];
}
for (int i = 0; i < M; i++)
{
cin >> ext;
s.insert(ext);
}
sort(arr, arr + N, cmp);
for (int i = 0; i < N; i++)
{
cout << arr[i] << "\n";
}
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준 20300] 서강근육맨 (C++) (0) | 2024.10.31 |
---|---|
[백준 16637] 괄호 추가하기 (C++) (0) | 2024.10.30 |
[백준 24416] 알고리즘 수업 - 피보나치 수 1 (C++) (0) | 2024.10.28 |
[백준 14465] 소가 길을 건너간 이유 (C++) (0) | 2024.10.26 |
[백준 2303] 숫자 게임 (C++) (0) | 2024.10.25 |