반응형
백준 알고리즘 2583번 영역구하기 문제는 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 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 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | import java.util.*; public class Main { private static int M; // 세로 private static int N; // 가로 private static List<AreaWeightCntDto> areaWeightCntList = new ArrayList<>(); // 결과를 보관할 리스트 private static List<Dot> visisted = new ArrayList<>(); // 방문여부를 체크할 리스트 private static Set<Dot> box = new HashSet<>(); // box의 위치를 부여하는 hashset public static void main(String[] args) { Scanner in = new Scanner(System.in); M = in.nextInt(); N = in.nextInt(); int K = in.nextInt(); // 공간 개수 int areaCnt = 0; // 현재 박스의 위치 좌표를 모두 보관 for (int i = 0; i < K; i++) { int x1 = in.nextInt(); int y1 = in.nextInt(); int x2 = in.nextInt(); int y2 = in.nextInt(); for (int tmpX = x1; tmpX < x2; tmpX++) { for (int tmpY = y1; tmpY < y2; tmpY++) { box.add(new Dot(tmpX, tmpY)); } } } // for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (enableGo(i, j)) { ++areaCnt; AreaWeightCntDto areaWeightCnt = new AreaWeightCntDto(1); areaWeightCntList.add(areaWeightCnt); visisted.add(new Dot(i, j)); getResult(i, j, areaWeightCnt); } } } // 결과 정렬 areaWeightCntList.sort((o1, o2) -> { return o1.getCnt() > o2.getCnt() ? 1 : -1; }); // 개수 출력 System.out.println(areaCnt); // 출력 areaWeightCntList.stream().forEach((e) -> { System.out.print(e.getCnt() + " "); }); } /** * 공간들의 합을 저장할 Dto */ static class AreaWeightCntDto { private int cnt; public AreaWeightCntDto(int cnt) { this.cnt = cnt; } public int getCnt() { return cnt; } public void setCnt(int cnt) { this.cnt = cnt; } public void increCnt() { ++this.cnt; } } /** * 공간 넓이 구하기 * * @param x * @param y * @param sum */ private static void getResult(int x, int y, AreaWeightCntDto sum) { if (enableGo(x, y + 1)) { visisted.add(new Dot(x, y + 1)); sum.increCnt(); ; getResult(x, y + 1, sum); } if (enableGo(x + 1, y)) { visisted.add(new Dot(x + 1, y)); sum.increCnt(); getResult(x + 1, y, sum); } if (enableGo(x, y - 1)) { visisted.add(new Dot(x, y - 1)); sum.increCnt(); getResult(x, y - 1, sum); } if (enableGo(x - 1, y)) { visisted.add(new Dot(x - 1, y)); sum.increCnt(); getResult(x - 1, y, sum); } } /** * 해당 좌표가 지나갈 수 있는 좌표인지 여부 확인 * * @param x * @param y * @return */ private static boolean enableGo(int x, int y) { // 경로 이탈 확인 if (x < 0 || y < 0 || x >= N || y >= M) { return false; } // 이미 방문했는지, 박스가 있는 위치인지 여부 확인. return (!box.contains(new Dot(x, y)) && !visisted.contains(new Dot(x, y))); } /** * 좌표를 담는 Dot 객체 */ static class Dot { public Dot(int x, int y) { this.x = x; this.y = y; } private int x; private int y; @Override public boolean equals(Object obj) { if (!(obj instanceof Dot)) { return false; } Dot tmp = (Dot) obj; return Objects.equals(this.x, tmp.x) && Objects.equals(this.y, tmp.y); } @Override public int hashCode() { return Objects.hash(this.x, this.y); } } } | cs |
반응형
'JAVA > 알고리즘' 카테고리의 다른 글
DFS로 미로 탈출하기 (0) | 2019.05.06 |
---|---|
백준 4936 - 섬의개수 (0) | 2018.10.06 |
백준 1929번 소수 구하기 문제 (0) | 2018.10.05 |
백준 알고리즘1032 명령프롬프트 문제 (0) | 2018.10.04 |
백준 알고리즘 11650 - 좌표 정렬하기 (0) | 2018.10.04 |