ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 2910 빈도정렬 ) c++
    알고리즘/백준 2022. 10. 15. 15:21
    반응형

    실버 3이라고 만만하게 보고 풀었다가 접근 방식을 세번정도 갈아엎은 문제

     

    #include <iostream>
    #include <vector>
    #include <map>
    #include <algorithm>
    
    using namespace std;
    
    struct bindo {
    	int num;
    	int cnt;
    	int idx;
    };
    
    vector<bindo> vec;
    
    bool cmp(const bindo& b1,const bindo& b2) {
    	if(b1.cnt == b2.cnt) {
    		return b1.idx < b2.idx;
    	}
    	else {
    		return b1.cnt > b2.cnt;
    	}
    }
    
    int main(void)
    {
    	int n,c;
    	cin >> n >> c;
    	
    	vector<int> rem;
    	for(int i=0; i<n; i++) {
    		int tmp;
    		cin >> tmp;
    		rem.push_back(tmp);
    	}
    	
    	for(int i=n-1; i>=0; i--) {
    		bool c = true;
    		for(int j=0; j<vec.size(); j++) {
    			if(vec[j].num == rem[i]) {
    				c = false;
    				vec[j].cnt += 1;
    				vec[j].idx = i;
    				break;
    			}
    		}
    		
    		if(c) {
    			vec.push_back({rem[i],1,i});
    		}
    	}
    	
    	sort(vec.begin(),vec.end(),cmp);
    	
    	for(int i=0; i<vec.size(); i++) {
    		for(int j=0; j<vec[i].cnt; j++) {
    			cout << vec[i].num << " ";
    		}
    	}
    	
    	return 0;
    }

     

    정답이 나오긴 했지만 이렇게 하면 

    N이 10000이 되는 경우 O(n2) = 1억 이므로 나와서 시간복잡도에 걸릴 확률이 매우 높아집니다.

     

    그래서 map을 이용해야한다는걸 알고는 있었지만 정렬을 어떻게 할지 몰라서 다른 사람의 풀이를 참고했습니다.

     

    #include <iostream>
    #include <vector>
    #include <map>
    #include <algorithm>
    #include <functional>
    using namespace std;
    
    map<int,int> order;
    
    bool cmp(const pair<int,int> a,const pair<int,int> b) {
    	if(a.second == b.second) {
    		return order[a.first] < order[b.first];
    	}
    	else {
    		return a.second > b.second;
    	}
    }
    
    int main(void)
    {
    	int n,c;
    	cin >> n >> c;
    	map<int,int> ma;
    	map<int,int>:: iterator it;
    	vector<pair<int,int> > vec;
    	
    	for(int i=0; i<n; i++) {
    		int tmp;
    		cin >> tmp;
    		ma[tmp]++;
    		if(order[tmp] == 0) order[tmp] = i+1;
    	}
    	
    	for(it = ma.begin(); it!= ma.end(); it++) {
    		vec.push_back({it->first,it->second});
    	}
    	
    	sort(vec.begin(),vec.end(),cmp);
    	
    	for(int i=0; i<vec.size(); i++) {
    		for(int j=0; j<vec[i].second; j++) {
    			cout << vec[i].first << " ";
    		}
    	}
    
    	return 0;
    }

    위 코드처럼 하게되면 n이 10000개가 되어도 시간초과에 걸리지않습니다.

     

     

    **

    map 순회방법

    map<int,int>:: iterator it;
    for(it = ma.begin(); it!= ma.end(); it++) {
        vec.push_back({it->first,it->second});
    }

     

     

    map 두개를 이용해 sort 하는 것에 대해 잘 알아두자!

    bool cmp(const pair<int,int> a,const pair<int,int> b) {
    	if(a.second == b.second) {
    		return order[a.first] < order[b.first];
    	}
    	else {
    		return a.second > b.second;
    	}
    }

     

     

     

    728x90
    반응형

    '알고리즘 > 백준' 카테고리의 다른 글

    백준 21772 가희의 고구마 먹방 c++  (0) 2022.12.15
    백준 2469 c++  (0) 2022.12.13
    백준 숨바꼭질 2 c++  (2) 2022.10.04
    백준 11286 절댓값 힙 c++  (1) 2022.10.04
    백준 14891 c++  (0) 2022.09.26

    댓글

Designed by Tistory.