알고리즘/백준
BOJ) 행렬
Zin0_0
2020. 7. 26. 15:37
반응형
행렬
1080번: 행렬
첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
www.acmicpc.net
풀이
n by m 으로 이루어진 두 행렬이 주어진다.
두 행렬이 같은지 비교하고, 만약 다르다면 3 by 3의 크기만큼 0->1, 1->0 으로 변환할 수 있다.
최소 몇 번을 값을 바꿔야 같아지는지 횟수를 구하는 문제다.
구할 수 없을 때는 -1을 출력한다.
Brute force 문제라고 생각해서 전체 탐색을 돌렸다.
특정 알고리즘이 들어가지 않고, 행렬을 비교하고, 다르다면 3 by 3의 행렬값을 뒤짚어주면서 답을 찾았다.
탐색이 끝난 이후에도 한번 더 행렬이 같은지 검사하여, 같다면 여태까지 값을 변경해온 count를, 다르다면 -1을 출력하도록 설정했다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private final static char ONE = '1', ZERO = '0';
private final static int DIV = 3;
private static int n,m;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
char[][] map = new char [n][m];
char[][] target = new char[n][m];
for(int i=0; i<n; i++) {
map[i] = br.readLine().toCharArray();
}
for(int i=0; i<n; i++) {
target[i] = br.readLine().toCharArray();
}
br.close();
solution(map, target);
}
private static void solution(char[][] map, char[][] target) {
int answer =0;
boolean isSame = false;
for(int y=0; y<=n-DIV; y++) { // 시작점 y
for(int x=0; x<=m-DIV; x++) { // 시작점 x
isSame = isSameMap(map,target);
if(isSame) { break; }
else {
if(map[y][x] != target[y][x]) { // 시작점이 다르면 바꿔야겠네?
map = getReverseMap(map, x, y);
answer++;
}
}
}
}
isSame =isSameMap(map,target);
if (!isSame) { answer = -1; }
System.out.println(answer);
}
private static boolean isSameMap(char[][] map, char[][] target) {
for(int y=0; y<n; y++) {
for(int x=0; x<m; x++) {
if(map[y][x] != target[y][x]) { return false; }
}
}
return true;
}
private static char[][] getReverseMap(char[][] map, int x, int y) {
for(int findY= y; findY <y+DIV; findY++) {
for(int findX =x; findX <x+DIV; findX++) {
if(map[findY][findX] == ZERO) { map[findY][findX] = ONE; }
else { map[findY][findX] = ZERO; }
}
}
return map;
}
private static char[][] copyMap(char[][] map) {
char[][] result = new char[n][m];
for(int y=0; y<n; y++) {
for(int x=0; x<m; x++) {
result[y][x] = map[y][x];
}
}
return result;
}
}
반응형