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

gogowonji·2022년 4월 1일
0

알고리즘

목록 보기
6/7

백준 1080번: 행렬

//  Created by gogowonji on 2022/04/01.
//

#include <iostream>
using namespace std;

int a[51][51];
int b[51][51];


int main() {
    // insert code here...
        
    
    int count = 0;
    int n,m;
    char c;
    cin >> n >> m;
    
    
    // 어떻게 받아올까?
    for(int i = 0; i < n; i++){
        
        for(int j = 0; j < m; j++){
            cin >> c;
            a[i][j] = c - 48;
        }
    }
    
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            cin >> c;
            b[i][j] = c - 48;
        }
    }
    
    // 어떻게 필터링할까?
    for(int i = 0; i < n-2; i++){
        for(int j = 0; j < m-2; j++){
            // 배열 비교 어떻게 할까?
            if (a[i][j] != b[i][j]){
                for(int fh = i; fh <= i+2; fh++){
                    for(int fw = j; fw <= j+2; fw++){
                        a[fh][fw] = 1 - a[fh][fw];
                    }
                }
                count++;
            }else continue;
            
        }
    }
    
    
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if(a[i][j] != b[i][j]){
                cout << "-1\n";
                return 0;
            }
        }
    }
    
    cout << count << "\n";

    return 0;
}

문제를 보니 인공지능이나 영상처리에서 했던 필터 개념이라 쉽다고 느껴졌다.
그래서 내가 필터행렬을 만들어 주었더니 비교 연산에서 꼬이기 시작했다.

두 행렬 비교를 해주어야 하는데
if (a[i][j] == b[i][j]) 으로 해결하려고 하다보니
전체를 모두 비교해주어야 하니 답이 나오지 않았다.

그래서 if (a[i][j] != b[i][j])으로 변경해주고 원소값이 다른 경우 해당 원소에는 행렬연산을 하지 못하도록 코드를 바꾸어주었다.
여기까지 하고 나니 필터 행렬을 쓸 수 없겠다는 생각이 들었다.

실패 했던 코드는 아래와 같다.

        
int sub[3][3] = {{1,1,1},{1,1,1},{1,1,1}};
for(int i = 1; i < n-1; i++){
for(int j = 1; j < m-1; j++){
				if (a[i][j] != b[i][j]){
            for(int fh = 0; fh < 3; fh++){
                for(int fw = 0; fw < 3; fw++){
                    a[i+fh-1][j+fw-1] = sub[fh][fw] - a[i+fh-1][j+fw-1];
                }
            }
            count++;
        }else continue;

    }
}

수업에서 배웠던 코드를 그대로 써주었는데,
if문에서는 i=0, j=0일때 비교가 되지 않아 실패한다는 것을 보지 못했고
int i=0, j=0로 바꾸어주면
필터 연산이 애초에 기준 i, j를 기준으로 좌우로 비교하는 연산이라 행렬 연산을 해줄 수 없었다. 진퇴양난의 상황이 발생했다.
그래서 과감히 필터 행렬을 버리고 숫자를 써주기로 했다.
다시 필터의 개념으로 돌아와서
어떻게 해야 시작을 하여 끝을 나가지 않고 연산을 할 수 있는지 생각한 다음
코드를 변경하여 완성하였다.
다 풀고나니 아는 내용이라고 해도 변형이 일어날 수 있기 때문에 여러 경우의 수를 생각해주고 코드를 짜나가야 한다는 것을 깨달았다..

profile
개발자를 할까 말까

0개의 댓글