1
+ public class JW_131703 {
2
+
3
+ public static void main (String [] args ) {
4
+ int [][] beginning = { { 0 , 1 , 0 , 0 , 0 }, { 1 , 0 , 1 , 0 , 1 }, { 0 , 1 , 1 , 1 , 0 }, { 1 , 0 , 1 , 1 , 0 },
5
+ { 0 , 1 , 0 , 1 , 0 } };
6
+ int [][] target = { { 0 , 0 , 0 , 1 , 1 }, { 0 , 0 , 0 , 0 , 1 }, { 0 , 0 , 1 , 0 , 1 }, { 0 , 0 , 0 , 1 , 0 },
7
+ { 0 , 0 , 0 , 0 , 1 } };
8
+ System .out .println (solution (beginning , target ));
9
+ }
10
+
11
+ static int n , m ;
12
+
13
+ public static int solution (int [][] beginning , int [][] target ) {
14
+ n = beginning .length ;
15
+ m = beginning [0 ].length ;
16
+ int min = Integer .MAX_VALUE ;
17
+ // 만들 수 있는 모든 조합
18
+ // row를 뒤집는 경우의 수
19
+ for (int i = 0 ; i < (1 << n ); i ++) {
20
+ // col을 뒤집는 경우의 수
21
+ for (int j = 0 ; j < (1 << m ); j ++) {
22
+ // 해당 뒤집는 경우의 수로 뒤집었을 때, 동일하다면
23
+ if (isPossible (beginning , target , i , j )) {
24
+ // 뒤집은 횟수
25
+ int cnt = Integer .bitCount (i ) + Integer .bitCount (j );
26
+ min = Math .min (min , cnt ); // 최솟값 갱신
27
+ }
28
+ }
29
+ }
30
+ return min == Integer .MAX_VALUE ? -1 : min ;
31
+ }
32
+
33
+ private static boolean isPossible (int [][] beginning , int [][] target , int row , int col ) {
34
+ for (int i = 0 ; i < n ; i ++)
35
+ for (int j = 0 ; j < m ; j ++) {
36
+ int v = beginning [i ][j ]; // 뒤집기 전의 값
37
+ // 뒤집은 row에 해당한다면
38
+ if (((1 << i ) & row ) != 0 ) {
39
+ v ^= 1 ; // 뒤집기
40
+ }
41
+ // 뒤집은 col에 해당한다면
42
+ if (((1 << j ) & col ) != 0 ) {
43
+ v ^= 1 ; // 뒤집기
44
+ }
45
+ // 결과가 target의 해당 값과 동일하지 않다면 false 반환
46
+ if (target [i ][j ] != v )
47
+ return false ;
48
+ }
49
+ return true ;
50
+ }
51
+ }
0 commit comments