본문 바로가기
알고리즘/백준

[백준 22232] 가희와 파일 탐색기 (C++)

by fortissimo 2024. 10. 29.

https://www.acmicpc.net/problem/22232

 

문제


 

가희는 jo_test 폴더에 들어와 있습니다. 가희는 jo_test에 있는 파일 N개를 아래 기준에 따라 정렬하려고 합니다.

  1. 파일명 (FILENAME) 사전순으로
  2. 파일명 (FILENAME)이 같다면 가희가 설치한 OS에서 인식하는 확장자가 붙은 것이 먼저 나오게
  3. 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;
}