ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ) 행렬
    알고리즘/백준 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;
        }
    }
    반응형

    '알고리즘 > 백준' 카테고리의 다른 글

    BOJ) 달팽이는 올라가고 싶다  (0) 2020.07.26
    BOJ) 합분해  (0) 2020.07.26
    BOJ) 로봇 청소기  (0) 2020.07.24
    BOJ) 사탕 게임  (0) 2020.07.24
    BOJ) 벽 부수고 이동하기  (0) 2020.07.23

    댓글

Designed by Tistory.