Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 그들이 속한 그룹 크기가 주어지면 사람들을 그룹화하십시오.

<시간/>

ID 범위가 0에서 n - 1인 n명의 사람이 있고 각 사람이 정확히 한 그룹에 속한다고 가정합니다. 길이가 n인 배열 groupSizes가 있습니다. 이 배열은 각 사람이 속한 그룹의 크기를 나타내며 거기에 있는 그룹과 각 그룹에 포함된 사람들의 ID를 찾아야 합니다.

입력이 − [3,3,3,3,3,1,3]과 같다고 가정하고 출력은 [[5], [0, 1, 2], [3, 4, 6]], 기타 가능 솔루션은 [[2,1,6],[5], [0,4,3]] 또는 [[5], [0,6,2], [4,3,1]]

일 수 있습니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 하나의 지도 만들기 m
  • 주어진 배열 a – 1의 크기 범위 0에서 i의 경우
    • m[g[i]]에 i 삽입
  • res라는 행렬 하나 만들기
  • 맵 m
      의 각 요소 i에 대해
    • i
        에 있는 목록의 크기까지 범위 0의 j에 대해
      • i 배열의 j번째 요소를 temp에 삽입
      • temp 크기 =i
          키인 경우
        • temp를 res에 새 행으로 삽입
        • 임시 배열 지우기
  • 반환 결과

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<auto> > v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << "[";
      for(int j = 0; j <v[i].size(); j++){
         cout << v[i][j] << ", ";
      }
      cout << "],";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<vector<int>> groupThePeople(vector<int>& g) {
      map <int, vector <int> > m;
      for(int i = 0; i < g.size(); i++){
         m[g[i]].push_back(i);
      }
      vector < vector <int> > res;
      map <int, vector <int> > :: iterator i = m.begin();
      vector <int> temp;
      while(i != m.end()){
         for(int j = 0; j < i->second.size(); j++){
            temp.push_back(i->second[j]);
            if(temp.size() == i->first){
               res.push_back(temp);
               temp.clear();
            }
         }
         i++;
      }
      return res;
   }
};
main(){
   vector<int> v = {3,3,3,3,3,1,3};
   Solution ob;
   print_vector(ob.groupThePeople(v));
}

입력

[3,3,3,3,3,1,3]

출력

[[5, ],[0, 1, 2, ],[3, 4, 6, ],]