파일 정리

YoungJae·2022년 7월 14일
0

Boj

목록 보기
14/14

문제

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

참고

https://ldgeao99.tistory.com/220

해당 문제는 주어진 바탕화면에 있는 파일의 이름에서 확장자의 이름과 확장자 파일의 개수를 출력하는 문제이다.
이때, 주의해야 할 점은 확장자가 여러 개 존재하는 경우에는 사전 순으로 출력해야 하는 것이다.

확장자 이름을 사전 순으로 출력하기 위해 map 자료구조를 사용했다.
(하지만 사실 비교 함수만 작성하면 string형 vector로도 가능할 것 같다.)

이 문제에서 핵심은 '.'을 기준으로 얼마나 문자열을 잘 파싱하는지이다.

처음에는 for 문을 통해 각 입력 문자열에 대해 '.'이 위치한 인덱스를 탐색한 다음, 다시 for 문을 통해 '.'이 위치한 인덱스 이후의 문자열을 저장하려고 했다.

하지만 string 문자열에 문자를 하나씩 추가하는 방법이 생각나지 않아서, string 헤더에서 제공하는 여러 함수를 찾게 됐다.
(정확하게는 분명 방법은 있었겠지만, char형 배열을 동적으로 선언해서 문자를 추가하여 문자열을 만들고, 이를 추가하는 식으로 구현하기에는 너무 복잡하게 느껴졌음)

사용한 함수는 특정 문자 혹은 문자열이 시작하는 위치를 반환하는 find() 함수와, 함수 인자로 받은 인덱스를 활용하여 문자열에서 해당 인덱스 부터 끝까지의 부분 문자열을 반환하는 substr() 함수이다.

두 함수를 통해 파일 이름에서 확장자만을 파싱할 수 있었고, 이를 map 자료구조의 key값으로 사용하여 각 확장자의 개수를 셀 수 있었다.

이전의 "국영수", "단어 정렬" 문제와 같이, 문자열을 다루는 문제가 나왔을때 string 헤더에 존재하는 여러 유용한 함수를 사용하여 빠르게 풀 수 있게, 관련된 내용을 따로 정리하는 시간을 가져야겠다.

위의 내용을 정리한 전체 코드는 다음과 같다.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <map>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	//freopen("input.txt", "rt", stdin);

	int n;
	cin >> n;

	vector<string> temp(n);
	map<string, int> table;
	map<string, int>::iterator it;

	for (int i = 0; i < n; i++) {
		cin >> temp[i];
	}

	for (int i = 0; i < n; i++) {
		int idx = temp[i].find(".");

		if (idx != -1) {
			string extend = temp[i].substr(idx + 1);
			table[extend]++;
		}
	}

	for (it = table.begin(); it != table.end(); it++) {
		cout << it->first << " " << it->second << "\n";
	}

	return 0;
}
profile
코딩테스트 넘어서기

0개의 댓글