만족은 하되 안주하지는 말자

기록해야 기억한다

프로그래밍/programmers&bj

[C++] 백준 1080번: 행렬

D36choi 2020. 7. 11. 22:34
728x90

https://www.acmicpc.net/problem/1080

 

1080번: 행렬

첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.

www.acmicpc.net

코드

#include <iostream>
#include <string.h>
#define MAX 50

using namespace std;

void toggle(bool (*arr)[MAX],int n,int m)
{
    for(int i=n; i<n+3; i++)
    {
        for(int j=m; j<m+3; j++)
        {
            if(arr[i][j])
            {
                arr[i][j] = false;
            }
            else
            {
                arr[i][j] = true;
            }
        }
    }
}

int main(){
    int N,M;
    string A[MAX];
    string B[MAX];
    bool ans[MAX][MAX] = {false};
    int answer=0;
    cin >> N >> M;

    for(int n=0 ; n<N; n++)
    {
        cin >> A[n];
    }
    for(int n=0; n<N; n++)
    {
        cin >> B[n];
        for(int m=0; m<M; m++)
        {
            if(A[n][m] == B[n][m])
            {
                ans[n][m] = true;
            }          
        }
    }
    if(N < 3 || M < 3)
    {
        for(int n=0;n<N;n++)
        {
            for(int m=0;m<M;m++)
            {
                if(!ans[n][m])
                {
                    cout <<"-1"<<"\n";
                    return 0;
                }
            }
        }
        cout <<"0\n";
        return 0;
    }

    for(int n=0; n<=N-3; n++)
    {
        for(int m=0; m<=M-3; m++)
        {
            if(!ans[n][m])
            {
                toggle(ans,n,m);
                answer++;
            }
        }
    }
    for(int n=0; n<N; n++)
    {
        for(int m=0; m<M; m++)
        {
            if(!ans[n][m])
            {
                cout << "-1"<<"\n";
                return 0;
            }
        }
    }
    cout<<answer<<"\n";
    return 0;
}

예외

3x3 미만의 행렬에 대해서는 둘이 일치할 경우 -> 0

일치하지않으면 -> -1

을 출력해야하는걸 제대로 처리하지않아 몇번 틀렸다.

 

핵심

3x3 행렬의 T/F 를 toggle 한 뒤,

F가 남아있는지를 체크하고 F가 남아있다면 가망성없는 경우이므로 -1 이다.

 

어차피 0~n-3, 0~m-3 에 대해 모두 F를 T로 바꿨을테니 

F가 남아있는 경우는 n-2~n-1 , m-2~m-1 에 대해서만 검사하면 되는 줄 알았는데 아닌가보다.