BaekJoon 14502, 연구소 dfs 전체 탐색
삼성에서 전체 탐색문제를 상당히 좋아하는 것 같습니다.
벽을 모든 경우로 놔보면서 최대 값을 찾는 문제입니다.
생각해보면 간단한데, 알고리즘에서 중요하다고 생각하는 것은 성능이라고 생각해서
에이 설마 전체로 보는 것은 아니겠지 하고, 다른 방법을 접근하다가..... 너무 오래걸렸던 문제입니다.
벽을 모든 경우로 놔보면서 최대 값을 찾는 문제입니다.
생각해보면 간단한데, 알고리즘에서 중요하다고 생각하는 것은 성능이라고 생각해서
에이 설마 전체로 보는 것은 아니겠지 하고, 다른 방법을 접근하다가..... 너무 오래걸렸던 문제입니다.
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 | import java.util.ArrayList; import java.util.Scanner; public class BaekJoon14502 { static int N, M, initZeroCount, infectionCount, max, tableOfOneDimension[]; static int[][] table; static ArrayList<Point> viruses = new ArrayList<>(); static Point[] wallPoint = new Point[3]; public static void main(String[] args) { Scanner sc = new Scanner(System.in); N = sc.nextInt();M = sc.nextInt();max = 0; table = new int[N][M]; tableOfOneDimension = new int[N * M]; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { table[i][j] = sc.nextInt();tableOfOneDimension[i * M + j] = table[i][j]; if (table[i][j] == 2) viruses.add(new Point(i, j)); initZeroCount += (table[i][j] == 0) ? 1 : 0; } } // if 1 dimension array for (int i = 0; i < M * N; i++) { if (tableOfOneDimension[i] == 0) wallPoint[0] = new Point(i / M, i % M); else continue; for (int j = i + 1; j < M * N; j++) { if (tableOfOneDimension[j] == 0 && !(wallPoint[0].x == j / M && wallPoint[0].y == j % M)) wallPoint[1] = new Point(j / M, j % M); else continue; for (int k = j + 1; k < M * N; k++) { if (tableOfOneDimension[k] == 0 && !(wallPoint[0].x == k / M && wallPoint[0].y == k % M) && !(wallPoint[1].x == k / M && wallPoint[1].y == k % M)) { wallPoint[2] = new Point(k / M, k % M); allCaseOfLocatingWall(wallPoint); } } } } System.out.println(max); } public static void allCaseOfLocatingWall(Point[] positionOfWall) { int[][] tempTable = new int[N][M]; int wallCount = 3; infectionCount = 0; for (int i = 0; i < N; i++) { System.arraycopy(table[i], 0, tempTable[i], 0, M); } for (int i = 0; i < positionOfWall.length; i++) { tempTable[positionOfWall[i].x][positionOfWall[i].y] = 1; } // locating wall for (int i = 0; i < viruses.size(); i++) { dfs(tempTable, viruses.get(i)); } // infection of virus max = Math.max((initZeroCount - infectionCount - 3), max); } public static void dfs(int[][] t, Point p) { if (t[p.x][p.y] == 0) infectionCount++; t[p.x][p.y] = 2; if (p.x > 0) if (t[p.x - 1][p.y] == 0) dfs(t, new Point(p.x - 1, p.y)); if (p.x < N - 1) if (t[p.x + 1][p.y] == 0) dfs(t, new Point(p.x + 1, p.y)); if (p.y > 0) if (t[p.x][p.y - 1] == 0) dfs(t, new Point(p.x, p.y - 1)); if (p.y < M - 1) if (t[p.x][p.y + 1] == 0) dfs(t, new Point(p.x, p.y + 1)); } } |