https://www.acmicpc.net/problem/1080
1080번: 행렬
첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
www.acmicpc.net
Solution
대표적인 그리디 문제다. 너무 복잡하게 생각하느라고 시간을 낭비한 편이다(...) 문제를 풀면서 깨달은 점은
- 0->1, 1->0 뒤집기 문제에서는 불일치 하는 숫자를 최대한 한번에 많이 뒤집으려고 하는 시도가 무의미하다..
=> 2번 뒤집으면 원상복귀한다.
=> 전부 일치하게 만드는 뒤집기가 아닌 이상 부분적으로 불일치가 일어난다. 이후에 처리가 되는지 알 수가 없다. - 현재 뒤집는 시도가 이전에 뒤집어 맞춰놓은 배열에 영향을 끼쳐서는 안된다.
=> 3x3 범위의 왼쪽 맨위 지점만을 비교하여 불일치 시 범위 내 배열을 모두 뒤집는다 (범위 내 다른 값은 비교하지 않음)
import java.util.*;
import java.io.*;
class Main
{
public static void main(String args[]) throws Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//StringBuilder sb = new StringBuilder();
StringTokenizer st;
st=new StringTokenizer(br.readLine()," ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[][] A=new int[N][M];
int[][] B=new int[N][M];
for(int i=0;i<N;i++) {
String input = br.readLine();
for(int j=0;j<M;j++) {
A[i][j]=input.charAt(j)-'0';
}
}
for(int i=0;i<N;i++) {
String input = br.readLine();
for(int j=0;j<M;j++) {
B[i][j]=input.charAt(j)-'0';
}
}
int cnt=0;
if(N>=3&&M>=3) {
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 x=i;x<i+3;x++) {
for(int y=j;y<j+3;y++) {
if(A[x][y]==0) A[x][y]=1;
else A[x][y]=0;
}
}
cnt++;
}
}
}
}
for(int i=0;i<N;i++) {
for(int j=0;j<M;j++) {
if(A[i][j]!=B[i][j]) {
System.out.println(-1);
return;
}
}
}
System.out.println(cnt);
}
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[백준] 2749 : 피보나치의 수 3 (JAVA) / 피보나치 수 구하는 방법, 재귀, 메모이제이션, 행렬) (0) | 2023.01.19 |
---|---|
[백준] 1956 : 운동 (JAVA), 플로이드-와샬(Floyd-Warshall) (0) | 2023.01.18 |
[백준] 1149 : RGB거리 (JAVA) (0) | 2022.07.28 |
[백준] 9663 : N-Queen (JAVA) (0) | 2022.07.28 |
[백준] 3273 : 두 수의 합 (JAVA) (0) | 2022.07.28 |
댓글