728x90
1. 문제
0과 1로만 이루어진 행렬 A와 행렬 B가 있다. 이때, 행렬 A를 행렬 B로 바꾸는데 필요한 연산의 횟수의 최솟값을 구하는 프로그램을 작성하시오.
행렬을 변환하는 연산은 어떤 3×3크기의 부분 행렬에 있는 모든 원소를 뒤집는 것이다. (0 → 1, 1 → 0)
2. 풀이
입력
입력 형식이 정확히 정해진 게 없는 것 같아서(공백이 있는 버전, 없는 버전 둘 다 있는듯함) replace로 공백을 제거한 후 char 배열로 만들었다.
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
char[][] A = new char[N][M];
char[][] B = new char[N][M];
for(int i=0;i<N;i++) A[i] = in.readLine().replace(" ","").toCharArray();
for(int i=0;i<N;i++) B[i] = in.readLine().replace(" ","").toCharArray();
탐색 및 변경
N-2, M-2까지 탐색하면서 A와 B가 다르다면 3x3행렬을 모두 바꾼다.
바꾸면서 answer+1한다.
int answer = 0;
for(int i=0;i<=N-3;i++){
for(int j=0;j<=M-3;j++){
if(A[i][j] != B[i][j]){
answer++;
for(int ni=i;ni<i+3;ni++){
for(int nj=j;nj<j+3;nj++){
if(A[ni][nj]=='0') A[ni][nj] = '1';
else A[ni][nj] = '0';
}
}
}
}
}
출력
행렬을 전체 탐색하면서 A와 B의 같은 위치에 다른 원소가 있다면 answer에 -1을 저장하고 바로 끝낸다.
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
if(A[i][j] != B[i][j]) {
answer = -1;
break;
}
}
}
System.out.println(answer);
전체 코드
import java.io.*;
import java.util.*;
public class BOJ_1080_행렬 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
char[][] A = new char[N][M];
char[][] B = new char[N][M];
for(int i=0;i<N;i++) A[i] = in.readLine().replace(" ","").toCharArray();
for(int i=0;i<N;i++) B[i] = in.readLine().replace(" ","").toCharArray();
int answer = 0;
for(int i=0;i<=N-3;i++){
for(int j=0;j<=M-3;j++){
if(A[i][j] != B[i][j]){
answer++;
for(int ni=i;ni<i+3;ni++){
for(int nj=j;nj<j+3;nj++){
if(A[ni][nj]=='0') A[ni][nj] = '1';
else A[ni][nj] = '0';
}
}
}
}
}
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
if(A[i][j] != B[i][j]) {
answer = -1;
break;
}
}
}
System.out.println(answer);
}
}
3. 결과
마지막 3x3 행렬만 비교하려고 했더니 틀렸다. 흠... 왜지? 모르겠다.
'코딩테스트 > BOJ' 카테고리의 다른 글
[BOJ] 1495 기타리스트 - JAVA (0) | 2023.08.28 |
---|---|
[BOJ] 1189 컴백홈 - JAVA (0) | 2023.08.14 |
[BOJ] 15658 연산자 끼워넣기 2 - JAVA (0) | 2023.08.13 |
[BOJ] 5972 택배 배송 - JAVA (0) | 2023.07.30 |
[BOJ] 25192 인사성 밝은 곰곰이 - JAVA (0) | 2023.07.29 |
댓글