<Algorithm> 101. 2234번 성곽
by BFine반응형
1. 2234번 성곽
DFS와 비트 연산을 활용하는 문제
1번과 2번은 실수가 있었지만 원하는데로 만들 수 있었는데 3번의 경우는 문제를 너무 단순하게 생각했던 것 같다.
3번을 처음 접근할때 벽을 없애고 모든 방을 탐색을 해서 최댓값을 구하려고 했는데 5중으로 for문이 중첩이 되었고 답은 나왔지만 당연히 메모리 초과가 발생했다.
어떻게 풀어야 할지 고민을 하던 중에 생각해보니 벽을 지운 방부터 탐색을 하니까 굳이 다른방은 볼필요가 없다는 것이 생각이 나서 3중 for문만으로 벽이 없을때 최댓값을 구할 수 있었다.
역시 알고리즘은 어떤 문제를 풀때 어떻게 하면 좀 더 효율적으로 짤 수 있는지에 대한 고민을 해야 할 것 같다.
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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; import javax.print.attribute.standard.Sides; public class Main { static int x; static int y; static int[][] arr; static boolean visited[][]; public static void main(String[] args) throws NumberFormatException, IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); x = Integer.parseInt(st.nextToken()); y = Integer.parseInt(st.nextToken()); arr = new int[y][x]; visited = new boolean[y][x]; dist = new int[y][x]; /****************************** * DFS와 비트연산을 활용해서 벽이 있을경우 * 탐색하는 방식으로 크기와 갯수를 * 구할 수 있다. 3번도 벽을 제거하고 * 탐색해서 넓이를 구해 최댓값을 찾는 * 방식으로 구할 수 있다. *******************************/ for(int i = 0; i < y ; i++) { st = new StringTokenizer(br.readLine()); for(int j = 0; j < x; j++) { arr[i][j] = Integer.parseInt(st.nextToken()); } } int count = 0; for(int i = 0; i < y ; i++) { for(int j = 0; j < x; j++) { if(!visited[i][j]) { breath = 0; dfs(i, j, arr[i][j]); high = Math.max(breath, high); count++; } } } System.out.println(count); System.out.println(high); int[] bit = {8,4,2,1}; // 남 동 북 서 for(Integer in : bit) { for(int i = 0; i < y ; i++) { for(int j = 0; j < x; j++) { if((in & arr[i][j]) == in) { visited = new boolean[y][x]; arr[i][j] = arr[i][j] - in; breath = 0; dfs(i, j, arr[i][j]); high = Math.max(breath, high); arr[i][j] = arr[i][j] + in; } } } } System.out.println(high); } static int max = Integer.MIN_VALUE; static int dist[][]; static int breath = 0; static int high = 0; public static void dfs(int i,int j, int wall) { visited[i][j] = true; int bit[] = new int[4]; int binary = 16; breath++; for(int k = 0; k < 4 ; k++) { binary = binary/2; bit[k] = wall & binary; } if(i+1<y && bit[0] != 8 && !visited[i+1][j]) { dfs(i+1, j, arr[i+1][j]); } if(j+1<x && bit[1] != 4 && !visited[i][j+1]) { dfs(i, j+1, arr[i][j+1]); } if(i-1>=0 && bit[2] != 2 && !visited[i-1][j]) { dfs(i-1, j, arr[i-1][j]); } if(j-1>=0 && bit[3] != 1 && !visited[i][j-1]) { dfs(i, j-1, arr[i][j-1]); } } } class Pair{ int x ; int y ; public Pair(int x, int y) { super(); this.x = x; this.y = y; } } | cs |
참고 & 출처
반응형
'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글
<Algorithm> 103. 2583번 영역구하기 (0) | 2019.02.05 |
---|---|
<Algorithm> 102. 모의고사(프로그래머스) (0) | 2019.02.04 |
<Algorithm> 100. 16197번 두동전 (0) | 2019.02.03 |
<Algorithm> 99. K번째수(프로그래머스) (0) | 2019.02.02 |
<Algorithm> 98. 더맵게(프로그래머스) (0) | 2019.02.01 |
블로그의 정보
57개월 BackEnd
BFine