틀렸다고 뜨는데 배열을 저장하는 방법에 있어서 struct
와 vector
를 적절하게 사용한 것인지 잘 모르겠음
빈번한 sort
도 비효율적인 것 같음
⭐️ struct
대신 vector pair
활용 ➡️ 이 방법 사용하면 추천횟수와 게시시간을 따로 떼어서 비교할 필요가 없고 이 둘을 하나의 set로 묶어서 비교 가능해 효율적
map<사진번호,pair<추천횟수,게시시간>>
로 저장pair<추천횟수,게시시간>
과 for 문으로 모든 map
들의 pair
를 통채로 비교해 탐색 map
의 erase
사용sort
를 사용해서 그때마다 정렬해주고 매번 1번 인덱스의 사진을 교환해주는 것이 아니라 필요할 때마다 for 문으로 최소 횟수 사진을 찾아서 갱신하는 방법이 더 나음 ➡️ 전체 개수가 작기 때문에 가능
#include <iostream>
#include <map>
using namespace std;
int main() {
int n,m;
cin >> n;
cin >> m;
map<int,pair<int, int>> photo; //사진틀에 있는 사진: map<사진번호,추천횟수,게시시간>
for(int i=0;i<m;i++) {
int idx;
cin >> idx;
// 아직 사진 틀에 없는 사진일 경우
if (photo.find(idx)==photo.end()) {
// 사진 틀에 공간 있을 경우
if (photo.size()<n) {
photo[idx].first=1;
photo[idx].second=i;
}
else {
pair<int,int> v;
int num=photo.begin()->first; // 사진틀 첫번째 사진 번호 가져오기
v=photo.begin()->second; //사진틀 <추천횟수,게시시간> 세트 가져오기
// 추천횟수가 작은 사진 탐색
for (auto it:photo) {
// 추천횟수가 작은 사진 찾으면 최소 사진 번호, 세트를 갱신하면서 탐색
if (it.second<v) {
num=it.first;
v=it.second;
}
}
// 최종적으로 지울 사진 지우고 새로운 사진으로 세팅
photo.erase(num);
photo[idx].first=1;
photo[idx].second=i;
}
}
// 이미 사진틀에 있는 사진일 경우
else photo[idx].first++;
}
for (auto it:photo) {
cout << it.first << " ";
}
}