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

C++에서 2행 이진 행렬 재구성

<시간/>

n개의 열과 2개의 행이 있는 행렬에 대한 다음 세부 정보가 있다고 가정합니다. -

  • 행렬 요소는 0 또는 1입니다.
  • 0번째(상단)행의 원소의 합을 상위로 한다.
  • 첫 번째(하단) 행의 요소 합은 더 낮은 것으로 표시됩니다.
  • i번째 열(0-인덱싱)에 있는 요소의 합은 colsum[i]이며, 여기서 colsum은 길이가 n인 정수 배열로 제공됩니다.

작업은 상위, 하위 및 colsum으로 행렬을 재구성하는 것입니다. 2D 정수 배열로 찾아야 합니다. 둘 이상의 유효한 솔루션이 있는 경우 그 중 하나가 허용됩니다. 유효한 솔루션이 없으면 빈 2D 배열을 반환합니다. 따라서 입력이 upper =2, lower =3이고 colsum이 [1,1,1]이면 출력은 [[1,1,0],[0,0,1]]

이 됩니다.

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

  • set flag :=true, n :=c의 크기, 2 * n의 순서로 하나의 배열을 만듭니다.
  • 0~n
      범위의 i에 대해
    • c[i] =2이면
      • u와 l을 1씩 감소
      • u <0 또는 l <0이면 플래그 :=false
      • Ans[0, i] =1 및 ans[1, i] =1
    • c[i] =1이면
      • u> l이면 u를 1만큼 감소, ans[0, i] :=1
      • 그렇지 않으면 u
      • 그렇지 않으면 c[i] =1일 때
      • u> 0이면 u를 1로 줄이고 ans[0, i] :=1
      • 그렇지 않으면 l> 0이면 l을 1로 줄이고 ans[1, i] :=1
      • 그렇지 않으면 플래그 설정 :=false
    • 그렇지 않으면 c[i] =0
      • c[i]> 0이면 플래그 설정 :=false
    • 그렇지 않으면 플래그 설정 :=false
  • 플래그가 거짓이거나 u가 0이 아니거나 l이 0이 아니면 빈 값을 반환합니다.
  • 반환

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

#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>> reconstructMatrix(int u, int l, vector<int>& c) {
      bool flag = true;
      int n = c.size();
      vector < vector <int> > ans(2, vector <int> (n));
      for(int i = 0; i < n; i++){
         if(c[i] == 2){
            u--;
            l--;
            if(u<0 || l<0)flag = false;
            ans[0][i] = 1;
            ans[1][i] = 1;
         }else if(c[i] == 1){
            if(u>l){
                  u--;
                  ans[0][i] = 1;
            }else if(u<l){
               l--;
               ans[1][i] = 1;
            }else{
               if(u>0){
                  u--;
                  ans[0][i] = 1;
               }else if(l > 0){
                  l--;
                  ans[1][i] = 1;
               }else
                  flag = false;
            }  
         }else if(c[i] == 0){
         if(c[i]>0)flag = false;
         }else{
            flag = false;
         }
      }
      if(!flag || u!=0 ||l!=0 )return {};
      return ans;
   }
};
main(){
   vector<int> v = {1,1,1};
   Solution ob;
   print_vector(ob.reconstructMatrix(2,1,v));
}

입력

2
1
[1,1,1]

출력

[[1, 1, 0, ],[0, 0, 1, ],]