[문제 위치]
https://www.acmicpc.net/problem/1080
[문제 풀이]
이 코드는 두 개의 행렬 AA와 BB를 입력받고, 행렬 AA를 행렬 BB로 바꾸는 데 필요한 연산의 최소 횟수를 계산하는 프로그램이다. 여기서 변환 연산은 3×33 \times 3 크기의 부분 행렬 값을 반전시키는 것이다.
코드의 주요 부분을 기록해두자:
- 변수 초기화 및 입력:
- A와 B는 각각 크기 51×5151 \times 51의 2차원 벡터로, 입력으로 주어지는 행렬을 저장한다.
- trans는 두 행렬 간의 차이를 기록하는 51×5151 \times 51 크기의 불리언 벡터다.
- change 함수는 주어진 좌표를 시작점으로 하는 3×33 \times 3 부분 행렬의 값을 반전시킨다.
- 행렬 입력:
- 두 행렬 AA와 BB의 값을 입력받는다. 각각의 값은 문자로 입력받아 정수로 변환한다.
- 차이 행렬 생성:
- trans 행렬을 생성하여 AA와 BB의 차이를 기록한다. AA와 BB가 다르면 true로 설정한다.
- 변환 연산:
- 행렬의 크기가 3×33 \times 3보다 작으면, 변환할 수 없기 때문에 차이가 나는 원소가 있으면 ans를 -1로 설정한다.
- 행렬의 크기가 충분히 크면, trans 행렬을 순회하며 true인 원소를 찾아 변환 연산을 수행하고 ans를 증가시킨다.
- 변환 연산 후에도 차이가 남아있는지 확인하여 남아있으면 ans를 -1로 설정한다.
- 결과 출력:
- 최종적으로 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 |