<Algorithm> 116. 보호필름(SWExpert)
by BFine반응형
1. 보호필름(SWExpert)
비트연산과 brute-force 문제
이문제는 초기화 같은 사소한 부분을 빠진게 있어서 상당히 오래 걸렸다.
조건의 크기가 크지않아서 O(2^n)이지만 brute-force로 가능했다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Solution { static int path; static int[][] arr; static int d; static int w; static int k; static int[] max_len; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int T = Integer.parseInt(br.readLine()); StringBuilder sb = new StringBuilder(""); for(int t = 0; t < T; t++) { /****************************** * 비트연산을 이용하여 모든 경우를 탐색한다. * 이때 약품 투입 1과 0 두가지 방식이 있으므로 * 2*2^n 가지 경우를 탐색하고 가장 적은 * 값을 구한다. *******************************/ min = Integer.MAX_VALUE; StringTokenizer st = new StringTokenizer(br.readLine()); d = Integer.parseInt(st.nextToken()); w = Integer.parseInt(st.nextToken()); k = Integer.parseInt(st.nextToken()); arr = new int[w][d]; max_len = new int[w]; for (int i = 0; i < d; i++) { st = new StringTokenizer(br.readLine()); for (int j = 0; j < w; j++) { arr[j][i] = Integer.parseInt(st.nextToken()); // 가로세로 반전 } } if (isPass()) { sb.append("#"+(t+1)+" "+0+"\n"); continue; // 투입 필요 없는경우 } int[][] temp = new int[w][d]; copy(temp, arr); for (int i = 1; i < 1 << d; i++) { max_len = new int[w]; combi(i, 0); // 0 투입 copy(arr, temp); max_len = new int[w]; combi(i, 1); // 1 투입 copy(arr, temp); } sb.append("#"+(t+1)+" "+(min)+"\n"); } System.out.println(sb.toString()); } static int min = Integer.MAX_VALUE; public static void combi(int bit,int val){ int cnt = 0; // 투입 개수 for(int i = 1,u=0; i < 1 << d; i=i*2,u++){ if((i & bit) == i){ cnt ++; for(int k = 0; k < w; k++){ arr[k][u] = val; } } } if(isPass()) { min = Math.min(min,cnt); } } public static void copy(int[][] target,int[][] arr){ for(int i = 0; i < arr.length;i++){ target[i] = arr[i].clone(); } } public static boolean isPass(){ for(int i = 0; i < w; i++){ int cnt = 1; for(int j = 0; j < d-1; j++){ if(arr[i][j] == arr[i][j+1]){ cnt += 1; }else{ max_len[i] = Math.max(max_len[i],cnt); cnt = 1; } } max_len[i] = Math.max(max_len[i],cnt); } for(int i = 0; i < w; i++){ if(max_len[i]-k < 0) return false; } return true; } } | cs |
참고 & 출처
반응형
'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글
<Algorithm> 118. 회문1(SWExpert) (0) | 2019.02.18 |
---|---|
<Algorithm> 117. 중위순회(SWExpert) (0) | 2019.02.17 |
<Algorithm> 115. 14890번 경사로 (0) | 2019.02.16 |
<Algorithm> 114. 2293번 동전1 (0) | 2019.02.15 |
<Algorithm> 113. 1149번 RGB거리 (0) | 2019.02.15 |
블로그의 정보
57개월 BackEnd
BFine