728x90
SMALL
백준 문제 풀이: 20291 [파일 정리]
문제 링크: https://www.acmicpc.net/problem/20291
문제 설명:
주어진 파일 목록에서 확장자의 종류별 개수를 계산하고, 이를 사전순으로 정렬하여 출력하는 프로그램을 작성하세요.
입력 조건:
- 첫째 줄에 파일의 개수 N이 주어집니다. (1 ≤ N ≤ 50,000)
- 둘째 줄부터 N개의 줄에 파일 이름이 주어집니다. 파일 이름은 확장자를 포함하며, 확장자는 항상 '.' 뒤에 위치합니다.
출력 조건:
- 확장자의 이름과 해당 확장자가 등장한 횟수를 사전순으로 한 줄에 하나씩 출력합니다.
문제 해결 코드
#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
map<string, int> mp; // 확장자와 등장 횟수 저장
string filename;
// 파일 입력 및 확장자 처리
for (int i = 0; i < n; i++) {
cin >> filename;
size_t pos = filename.find_last_of('.'); // 마지막 '.'의 위치 찾기
string extension = filename.substr(pos + 1); // '.' 이후의 문자열 추출
mp[extension]++; // 확장자 개수 증가
}
// 결과를 사전순으로 정렬
vector<pair<string, int>> sorted(mp.begin(), mp.end());
sort(sorted.begin(), sorted.end());
// 출력
for (const auto &entry : sorted) {
cout << entry.first << ' ' << entry.second << '\n';
}
return 0; // 프로그램 정상 종료
}
코드 설명
위 코드는 주어진 파일 이름에서 확장자를 추출하고, 이를 사전순으로 정렬하여 확장자의 개수를 출력합니다.
- 확장자 추출:
- `find_last_of('.')`를 사용하여 마지막 '.'의 위치를 찾습니다.
- `substr(pos + 1)`을 사용하여 '.' 뒤의 문자열(확장자)을 추출합니다.
- 확장자 개수 저장:
- `map`을 사용하여 확장자 이름을 키로, 해당 확장자의 등장 횟수를 값으로 저장합니다.
- 정렬 및 출력:
- `map`을 `vector`로 변환한 뒤, 사전순으로 정렬합니다.
- 정렬된 결과를 출력합니다.
시간 복잡도 분석:
- 입력 및 확장자 추출: O(N).
- 정렬: O(K log K), K는 고유 확장자의 개수 (최대 N).
- 출력: O(K).
전체 시간 복잡도는 O(N + K log K)로 효율적으로 처리 가능합니다.
결과
다음은 입력 예시와 출력 결과입니다:
입력:
8
input.txt
notes.txt
document.docx
image.png
input.txt
image.jpeg
notes.txt
code.cpp
출력:
cpp 1
docx 1
jpeg 1
png 1
txt 3
파일의 확장자는 사전순으로 정렬되며, 각 확장자의 개수가 출력됩니다.
다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!
728x90
LIST
'BAEKJOON > 자료 구조' 카테고리의 다른 글
백준 2357번 [최솟값과 최댓값](C++)-yes6686- 티스토리 (0) | 2024.01.01 |
---|---|
백준 2042번 [구간 합 구하기](C++)-yes6686- 티스토리 (0) | 2024.01.01 |
백준 1874번 [스택 수열](C++)-yes6686- 티스토리 (0) | 2023.12.21 |
백준 18870번 [좌표 압축](C++)-yes6686- 티스토리 (0) | 2023.12.19 |
백준 2910번 [빈도 정렬](C++)-yes6686- 티스토리 (0) | 2023.12.16 |