반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 소프티어
- incr
- 오퍼레터
- dfs
- 이분탐색
- 처우협의
- 백트래킹
- 성적평가
- 13908
- msSQL
- 퇴사통보
- compose
- Docker
- 6987
- OFFSET
- 파라메트릭
- 기술면접
- boj #19237 #어른 상어
- 백준
- 물채우기
- 연결요소
- Kafka
- BOJ
- @P0
- softeer
- 경력
- 매개변수탐색
- 처우산정
- BFS
- upper_bound
Archives
- Today
- Total
기술 블로그
2573번 빙산 본문
728x90
반응형
https://www.acmicpc.net/problem/2573
DFS, dy + dx 활용 문제이다.
지구온난화가 발생하기 전에, isZero() 함수를 통해 전체 Map이 0인지 아닌지 검사를 하고,
연결 요소의 개수를 검사한다.
이후에 지구온난화가 발생하고, 그에 따른 높이가 낮아지게 된다.
예전에 푼 코드를 보니, 그 때에는 [303][303] 크기의 배열을 2개로 선언하여,
지구온난화가 발생했을 때, 이중 for문에서의 배열과, 0의 개수를 세는 for문에서의 배열을 다르게 하여
서로 영향을 미치지 않게 했다.
즉, 2와 4가 붙어있다고 했을 때, 2의 주변에 0의 개수가 2개라면, 0이 될 것이고,
4의 주변에 0의 개수를 검사했을 때, 2가 0이 된 것을 포함시키면 안 된다.
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 | #include <iostream> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <cstring> #include <string> #include <math.h> #include <algorithm> #include <map> using namespace std; int Map[303][303] = { 0, }; int N = 0, M = 0; bool visit[303][303] = { false, }; int dy[4] = { -1, 0, 1, 0 }; int dx[4] = { 0, -1, 0, 1 }; vector<int> v; bool isZero() { for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (Map[i][j] != 0) return false; } } return true; } void DFS(int r, int c) { visit[r][c] = true; for (int i = 0; i < 4; i++) { int y = r + dy[i]; int x = c + dx[i]; if (y < 0 || y >= N || x < 0 || x >= M || visit[y][x] || Map[y][x] == 0) continue; DFS(y, x); } } void globalWarming(int r, int c) { int Cnt = 0; for (int i = 0; i < 4; i++) { int y = r + dy[i]; int x = c + dx[i]; if (y < 0 || y >= N || x < 0 || x >= M || Map[y][x] != 0) continue; if(Map[y][x] == 0) ++Cnt; } v.push_back(Cnt); } int main(void) { memset(Map, 0, sizeof(Map)); bool Zero = false; int year = 0; scanf("%d %d", &N, &M); for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { scanf("%d", &Map[i][j]); } } while (1) { int Connected_Component = 0; if (!v.empty()) v.clear(); memset(visit, false, sizeof(visit)); if (isZero()) { Zero = true; break; } for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (!visit[i][j] && Map[i][j] != 0) { ++Connected_Component; DFS(i, j); } } } if (Connected_Component >= 2) break; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (Map[i][j] != 0) { globalWarming(i, j); } } } int index = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (Map[i][j] != 0) { Map[i][j] -= v.at(index++); if (Map[i][j] < 0) Map[i][j] = 0; } } } ++year; } if (Zero) printf("0\n"); else printf("%d\n", year); return 0; } | cs |
728x90
반응형
'알고리즘 문제 > BOJ' 카테고리의 다른 글
1325번 효율적인 해킹 (0) | 2018.11.04 |
---|---|
14910번 오르막 (0) | 2018.11.03 |
1032번 명령 프롬프트 (0) | 2018.10.29 |
13300번 방 배정 (0) | 2018.10.28 |
11758번 CCW (0) | 2018.10.28 |