티스토리 뷰
백준 1743번 문제입니다. 이번에도 탐색을 활용한 문제입니다!
밑에는 제 코드입니다.
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 | #include <stdio.h> #include <string.h> #include <stdbool.h> #define MAX 110 int N, M; int cnt; int size; int trash[MAX][MAX]; bool visited[MAX][MAX]; void dfs(int r, int c) { visited[r][c] = true; size++; if (r > 0 && trash[r][c] == trash[r - 1][c] && !visited[r - 1][c]) dfs(r - 1, c); if (c > 0 && trash[r][c] == trash[r][c - 1] && !visited[r][c - 1]) dfs(r, c - 1); if (r < N && trash[r][c] == trash[r + 1][c] && !visited[r + 1][c]) dfs(r + 1, c); if (c < M && trash[r][c] == trash[r][c + 1] && !visited[r][c + 1]) dfs(r, c + 1); } int main(void) { int SIZE[10001]; scanf("%d%d", &N, &M); int k; scanf("%d", &k); for (int i = 0; i < k; i++) { int x, y; scanf("%d%d", &x, &y); trash[x-1][y-1] = 1; } for (int r = 0; r < N; r++) { for (int c = 0; c < M; c++) { if (!visited[r][c] && trash[r][c]) { dfs(r, c); SIZE[cnt] = size; cnt++; size = 0; } } } for (int i = 0; i < cnt - 1; i++) { for (int k = 0; k < cnt - i - 1; k++) { if (SIZE[k] < SIZE[k + 1]) { int t = SIZE[k]; SIZE[k] = SIZE[k + 1]; SIZE[k + 1] = t; } } } printf("%d\n", SIZE[0]); return 0; } | cs |
12~19:dfs로 음식물을 탐색합니다.
26~30:저는 인덱스가 0일때에도 사용하고 싶어서 x-1, y-1을 해주었습니다.
31~40:탐색하는 부분입니다. 방문하지 않았고 음식물이 있다면 탐색을 시작합니다. 크기를 저장하고 초기화한뒤 갯수를 하나 증가!
41~49:정렬(버블정렬)
출력.
'Coding > acmicpc' 카테고리의 다른 글
백준 2178:미로 탐색 (0) | 2018.03.13 |
---|---|
백준 9466:텀 프로젝트 (4) | 2018.03.09 |
백준 10451:순열 사이클 (0) | 2018.02.28 |
백준 2583:영역 구하기 (0) | 2018.02.27 |
백준 2606:바이러스 (0) | 2018.02.23 |