하루 1문제 챌린지/Silver1

백준 1080번 행렬(C++)🚩🚩

그린푸딩 2024. 3. 1. 13:18
728x90
반응형

실버1인데 어려웠다..

일단 행렬 A,B 를 n*m으로 하면 계속 입력이 잘안되었다. 

 

접근 1.다른부분 처음에 정리 -> 하나씩 바꾸기 -> 끊임없이 바꾸기? -> 안되면 무한루프.. 
체크한 다른 부분 계속 바뀌는데 계속 n*m 행렬 확인하면 비효율적.. 

 

정답 

 

3x3 행렬단위만 바꿀수 있으므로 n-3,m-3까지만 체크하고 (i,j)를 왼쪽 꼭지점으로 생각하면 여길 체크하면 다음부턴 

체크 할 필요가 없어짐(바꿀수 없으므로). 하나하나 다바꿔보고 안되면 안되는것!

 

#include<vector>
#include<iostream>

using namespace std;


int main()
{
   int n,m;
   cin>>n>>m;
   
   vector<string>A(n);
   vector<string>B(n);
   //n*n 숫자 입력으로 하면 안됨

   string tmp;
   for(int i=0;i<n;i++){
       cin>>A[i];
   }
   
   for(int i=0;i<n;i++){
       cin>>B[i];
   }
   
   int cnt=0;
   for(int i=0;i<=n-3;i++){
       for(int j=0;j<=m-3;j++){
           if(A[i][j]!=B[i][j]){

               //바꾸기 
               for(int k=i;k<i+3;k++){
                 
                   for(int s=j;s<j+3;s++){
                     
                       if(A[k][s]=='0')A[k][s]='1';
                       else A[k][s]='0';
                   }
               }
               
               cnt++;
           }
       }
   }    
   
  
   //1.다른부분 처음에 정리 -> 하나씩 바꾸기 -> 끊임없이 바꾸기? -> 안되면 무한루프.. 
   //계속 바뀌는 문제 
      //같은지 검사 
    
     for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
           if(A[i][j]!=B[i][j]){
              cout<<-1; return 0;
           }
         }
      }
     
     cout<<cnt; 
    
    return 0;
}
728x90
반응형