-
[백준 1080번] 행렬 (Java 풀이)Algorithm/Greedy Algorithm 2022. 2. 18. 16:44
백준알고리즘 1080번 : 행렬
예제에서 유추할 수 있듯 3x3크기의 부분행렬을 한번에 바꾸기 때문에 그보다 작은 행렬이 문제로 나온다면
다를 경우 -1, 같을 경우 0을 출력하는 것으로 판단할 수 있다.
문제는 3x3이상의 행렬인데, 이 경우에는 부분행렬중 좌측 최상단의 값만 이용하여 비교하는 식으로했다.
좌측 상단에서 우측 하단으로 탐색하면 언제나 좌측 최상단의 값은 해당 탐색 이후로는 변경할 수 없는 값이된다.
이를 바탕으로 행렬 A와 행렬 B의 좌측 최상단의 값만 비교하고, 같으면 다음 탐색으로 pass,다르면 최상단을 포함한 3x3크기의 부분행렬을 모두 바꾸어주는 방식으로 전개한다.
메소드를 더 다양하게 사용했더라면 코드 길이는 훨씬 줄었을 문제이다. 그래도 소요시간 자체는 오래걸리지 않았다.풀이 과정
1. 2차원 배열에 행렬 A, B를 받는다.
2. 3x3 행렬보다 행이나 열이 작은 경우에는 비교 후 0 혹은 -1을 출력하게 한다.
3. 그 외의 경우에는 좌측 최상단의 값부터 (N-2)*(M-2) 번 만큼 탐색해준다.
4. A, B의 좌측 최상단 값이 다른 경우 행렬 A(혹은 B)의 값을 변경해준다.(3x3, 총 9개)
5. 변경한 횟수를 cnt하고, 최종적으로 행렬이 일치하면 cnt를, 불일치하면 -1을 출력한다.소스 ▽
더보기import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main {// No1080 : 행렬 public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int x = Integer.parseInt(st.nextToken()); int y = Integer.parseInt(st.nextToken()); int[][] arr1 = new int[x][y]; int[][] arr2 = new int[x][y]; for (int i = 0; i < x; i++) { String[] tmp = br.readLine().split(""); for (int j = 0; j < y; j++) { arr1[i][j] = Integer.parseInt(tmp[j]); } } for (int i = 0; i < x; i++) { String[] tmp = br.readLine().split(""); for (int j = 0; j < y; j++) { arr2[i][j] = Integer.parseInt(tmp[j]); } } int ans = 0; if (x < 3 || y < 3) { stop: for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { if (arr1[i][j] != arr2[i][j]) { ans = -1; break stop; } } } System.out.println(ans); } else { for (int i = 0; i < x - 2; i++){ for (int j = 0; j < y - 2; j++) { if (arr1[i][j] != arr2[i][j]) { int tmpX = i; int tmpY = j; ans++; for (int k = tmpX; k < tmpX + 3; k++) { for (int l = tmpY; l < tmpY + 3; l++) { arr1[k][l] = Change(arr1[k][l]); } } } } } stop2 : for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { if (arr1[i][j] != arr2[i][j]) { ans = -1; break stop2; } } } System.out.println(ans); } } public static int Change(int num) { if (num == 0) { return 1; } else { return 0; } } }
'Algorithm > Greedy Algorithm' 카테고리의 다른 글
[백준 1543번] 문서 검색(Java 풀이) (0) 2022.02.23 [백준 1449번] 수리공 항승 (Java 풀이) (0) 2022.02.22 [백준 1744번] 수 묶기 (Java 풀이) (0) 2022.02.18 [백준 1049번] 기타줄 (Java 풀이) (0) 2022.02.15 [백준 1715번] 카드 정렬하기 (Java 풀이) (0) 2022.02.14