#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <string>
using namespace std;
// 영화 정보를 담는 구조체
struct Movie {
string title;
double rating;
};
// 추상 클래스: 영화 데이터 처리를 위한 인터페이스 역할
class MovieProcessor {
public:
// 순수 가상 함수: 상속받는 클래스에서 반드시 구현해야 함
virtual void process(vector<Movie>& movies) = 0;
virtual ~MovieProcessor() {} // 가상 소멸자
};
// 영화 관리 클래스
class MovieManager {
private:
vector<Movie> movies; // 전체 목록 저장용
map<string, double> movieMap; // 빠른 제목 검색용
public:
MovieManager() {
// 초기 데이터 설정
movies = {
{"Inception", 9.0},
{"Interstellar", 8.6},
{"The Dark Knight", 9.1},
{"Memento", 8.4}
};
// 검색을 위해 맵에 데이터 복사
for (const auto& movie : movies) {
movieMap[movie.title] = movie.rating;
}
}
// 기본 목록 출력
void printMovies() {
cout << "영화 목록:\n";
for (const auto& movie : movies) {
cout << "제목: " << movie.title << ", 평점: " << movie.rating << "\n";
}
}
// 맵을 활용한 효율적인 영화 검색
void findMovie(const string& title) {
auto it = movieMap.find(title);
if (it != movieMap.end()) {
cout << "영화 제목: " << it->first << ", 평점: " << it->second << "\n";
} else {
cout << "해당 영화는 목록에 없습니다.\n";
}
}
// 외부에서 정의된 프로세서(정렬, 필터 등)를 실행하는 함수
void processMovies(MovieProcessor& processor) {
processor.process(movies);
}
};
// 정렬 기준 정의: 평점 내림차순
bool compareMovies(const Movie& a, const Movie& b) {
return a.rating > b.rating;
}
// 영화 평점 기준 정렬 클래스
class RatingSorter : public MovieProcessor {
public:
void process(vector<Movie>& movies) override {
// STL sort 함수 사용 (내림차순)
sort(movies.begin(), movies.end(), compareMovies);
cout << "평점 기준 정렬된 영화 목록:\n";
for (const auto& movie : movies) {
cout << "제목: " << movie.title << ", 평점: " << movie.rating << "\n";
}
}
};
// 평점 필터링 클래스
class RatingFilter : public MovieProcessor {
private:
double minRating; // 기준 평점
public:
explicit RatingFilter(double minRating) : minRating(minRating) {}
void process(vector<Movie>& movies) override {
cout << "평점 " << minRating << " 이상인 영화 목록:\n";
for (const auto& movie : movies) {
if (movie.rating >= minRating) {
cout << "제목: " << movie.title << ", 평점: " << movie.rating << "\n";
}
}
}
};