파일(file)은 단어 스트림을 저장하는 메모리 위치입니다. 하나의 파일 안에는 다양한 단어들이 포함되어 있으며, 이번 글에서는 파일 속 모든 고유한(unique) 단어를 찾아 출력하는 C++ 프로그램을 살펴보겠습니다.
여기서 고유한 단어란 파일 내에서 단 한 번만 등장하는 단어를 의미합니다.
예를 들어 다음 문장을 보겠습니다.
Tutorials point is best for programming tutorials.
이 문장에서 'tutorials'라는 단어는 두 번 등장하므로 고유하지 않습니다. 반면 나머지 단어들은 각각 한 번씩만 등장하기 때문에 모두 고유한 단어입니다.
알고리즘
반복자(iterator)를 활용해 데이터(data)와 출현 횟수(occurrence) 두 가지 정보를 관리하면서 주어진 파일의 고유 단어를 확인합니다.
- 입력: 파일
- 1단계: 파일에서 각 줄을 읽어 들인 뒤 2단계로 진행합니다.
- 2단계: 반복자를 사용해 현재 단어가 자료구조(map)에 이미 존재하는지 확인합니다.
- 단어가 존재하면 → 해당 단어의 출현 횟수를 1 증가시킵니다.
- 단어가 존재하지 않으면 → 새 항목으로 추가하고 출현 횟수를 1로 설정합니다. - 3단계: 자료구조 전체를 순회하면서 각 단어의 출현 횟수를 확인합니다.
- 출현 횟수가 정확히 1이면 해당 단어를 출력하고, 그렇지 않으면 아무 작업도 수행하지 않습니다.
C++ 구현 예제
#include <iostream>
#include <fstream>
#include <map>
#include <string>
using namespace std;
int main(){
// 샘플 파일 생성 및 내용 작성
ofstream fout("test.txt", ios::trunc);
fout << "tutorials point is best for programming tutorials";
fout.close();
// 파일을 열어 단어별 등장 횟수 계산
ifstream fin("test.txt");
map<string, int> mp;
string word;
while (fin >> word){
if (!mp.count(word))
mp.insert(make_pair(word, 1));
else
mp[word]++;
}
fin.close();
// 등장 횟수가 1인 단어(고유 단어)만 출력
for (map<string, int>::iterator p = mp.begin(); p != mp.end(); p++){
if (p->second == 1)
cout << p->first << endl;
}
return 0;
}
코드 설명
- ofstream으로 test.txt 파일을 생성하고 샘플 문장을 기록한 뒤 닫습니다.
- ifstream으로 같은 파일을 다시 열고, >> 연산자를 통해 공백을 기준으로 단어를 하나씩 읽어 들입니다.
- map<string, int>은 단어를 키로, 등장 횟수를 값으로 저장합니다. 처음 등장한 단어는 1로 초기화하고, 이미 존재하는 단어는 값을 1씩 증가시킵니다.
- 마지막으로 map을 처음부터 끝까지 순회하면서 등장 횟수가 1인 단어만 화면에 출력합니다.
실행 결과
best
for
is
point
programming
참고: std::map은 키를 사전순으로 정렬하여 저장하므로 결과가 알파벳 순서대로 출력됩니다. 삽입 순서나 성능이 더 중요하다면 unordered_map을 사용하면 평균 O(1)의 시간 복잡도로 더 빠르게 처리할 수 있습니다.