본문 바로가기

문제 풀이/문제 풀이(BOJ)

[Silver I] 행렬 - 1080

[문제 위치]

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

[문제 풀이]

이 코드는 두 개의 행렬 AABB를 입력받고, 행렬 AA를 행렬 BB로 바꾸는 데 필요한 연산의 최소 횟수를 계산하는 프로그램이다. 여기서 변환 연산은 3×33 \times 3 크기의 부분 행렬 값을 반전시키는 것이다.

코드의 주요 부분을 기록해두자:

  1. 변수 초기화 및 입력:
    • A와 B는 각각 크기 51×5151 \times 51의 2차원 벡터로, 입력으로 주어지는 행렬을 저장한다.
    • trans는 두 행렬 간의 차이를 기록하는 51×5151 \times 51 크기의 불리언 벡터다.
    • change 함수는 주어진 좌표를 시작점으로 하는 3×33 \times 3 부분 행렬의 값을 반전시킨다.
  2. 행렬 입력:
    • 두 행렬 AABB의 값을 입력받는다. 각각의 값은 문자로 입력받아 정수로 변환한다.
  3. 차이 행렬 생성:
    • trans 행렬을 생성하여 AABB의 차이를 기록한다. AABB가 다르면 true로 설정한다.
  4. 변환 연산:
    • 행렬의 크기가 3×33 \times 3보다 작으면, 변환할 수 없기 때문에 차이가 나는 원소가 있으면 ans를 -1로 설정한다.
    • 행렬의 크기가 충분히 크면, trans 행렬을 순회하며 true인 원소를 찾아 변환 연산을 수행하고 ans를 증가시킨다.
    • 변환 연산 후에도 차이가 남아있는지 확인하여 남아있으면 ans를 -1로 설정한다.
  5. 결과 출력:
    • 최종적으로 ans 값을 출력하여 변환에 필요한 최소 연산 횟수를 표시한다.

이 코드는 주어진 두 행렬을 비교하고 필요한 최소 연산 횟수를 계산하는 데 사용된다. 변환 연산은 3×33 \times 3 크기의 부분 행렬을 뒤집는 것이며, 모든 차이를 없애기 위해 몇 번의 변환이 필요한지 계산하는 것이다.

 

아래는 코드다

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>


using namespace std;

vector<vector<int> > A(51,vector<int> (51,0));
vector<vector<int> > B(51,vector<int> (51,0));
vector<vector<bool> > trans(51,vector<bool> (51,false));


void change(int m,int n){

    for(int i = m; i< m+3; i++){
        for(int j = n; j < n+3; j++){
            trans[i][j] = !trans[i][j];
        }
    }

}



int main(){


    int m,n;
    cin>>m>>n;
    char c;
    int ans = 0;
    for(int i = 0; i<m; i++){
        for(int j = 0; j < n; j++){
            cin>>c;
            A[i][j] = c-48;
        }
    }
    for(int i = 0; i<m; i++){
        for(int j = 0; j < n; j++){
            cin>>c;
            B[i][j] = c-48;
            if(B[i][j] != A[i][j]){
                trans[i][j] = true;
            }
        }
    }

    if(m< 3 || n < 3){
        for(int i = 0; i < m; i++){
            for(int j = 0; j<n; j++){
                if(trans[i][j]){
                    ans = -1;
                    break;
                }
            }
        }
    }
    else{
        for(int i = 0; i <= m-3; i++){
            for(int j = 0; j <= n-3; j++){
                if(trans[i][j] == true){
                    change(i,j);
                    ans++;
                }
                
            }
        }
    }

    
    for(int i = 0; i < m; i++){
        for(int j =0; j<n;j++){
            if(trans[i][j])
                ans = -1;
        }
        
    }

    cout<<ans<<endl;


    return 0;
}

'문제 풀이 > 문제 풀이(BOJ)' 카테고리의 다른 글

[Gold V] 공통 부분 문자열 - 5582  (0) 2024.07.10
[Bronze III] 얼마? - 9325  (0) 2024.07.07
[Gold V] AB - 12904  (0) 2024.07.06
[Gold V] 1학년 - 5557  (0) 2024.07.06
[Gold V] 퇴사 2 - 15486  (1) 2024.07.05