250x250
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 |
Tags
- 실비용
- 인프라
- 여행
- 영국
- RabbitMQ
- 일정
- JAVA #언어 #프로그래밍 #IT #개발 #코딩
- 샐러리
- 리눅스
- 예약
- JAVA #객체지향 #프로그래밍 #언어 #IT #기초
- IT
- 계획
- 배낭여행
- 준비
- 파이썬
- 경험
- 여행 #
- ip
- #DB#SQLD#자격증
- 메시지 큐
- 유럽
- 내심정
- 이탈리아
- 서버
- 추억
- 겨울
- 유럽여행
- 1달살기
- JAVA #언어 #프로그래밍 #코딩 #static #정적함수 #정적변수 #클래스
Archives
- Today
- Total
YoonWould!!
[삼성SWTest준비]14502번 연구소 본문
728x90
URL : https://www.acmicpc.net/problem/14502
삼성SW 기출 문제 한 번에 보기 : https://www.acmicpc.net/workbook/view/1152
2017년 상반기 삼성 SW 역량평가 기출문제
그냥 보고서 DFS 네? 생각했다가 판정까지 BFS네?
생각하고 DFS, BFS를 이용하여 풀이해야 겠다고 생각을 하고
총 과정이 3개가 필요하다고 생각했다.
과정 1 ) 완전/전체 탐색을 해서 벽3개를 세울 수 있는 모든 경우의 수를 보고
과정 2 ) BFS를 사용해서 과정 1)을 마친 경우에 맵에 있는 모든 바이러스를 퍼지게 한다.
과정 3 ) 해당 map에 안전 영역 수를 계산한다.
※필요 역량 정리하기!!!※
1. bfs
2. 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 | #include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<vector> using namespace std; int n, m; int map[9][9]; int remap[9][9]; int dx[4] = { -1,0,1,0 }; int dy[4] = { 0,1,0,-1 }; vector<pair<int, int>> v; // 0인 안전역영을 넣는다. void dfs(int x, int y) { // 바이러스를 퍼뜨리기 위한 dfs for (int i = 0; i < 4; i++) { int nx = dx[i] + x; int ny = dy[i] + y; if (nx > 0 && nx <= n && ny > 0 && ny <= m) { if (remap[nx][ny] == 0) { remap[nx][ny] = 2; dfs(nx, ny); } } } } int main() { scanf("%d %d", &n, &m); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { scanf("%d", &map[i][j]); remap[i][j] = map[i][j]; if (map[i][j] == 0) { v.push_back(make_pair(i, j)); } } } int MAX = 0; for (int i = 0; i < v.size() - 2; i++) { for (int j = i + 1; j < v.size() - 1; j++) { for (int k = j + 1; k < v.size(); k++) { pair<int, int> one = v[i]; pair<int, int> two = v[j]; pair<int, int> three = v[k]; //3개의 좌표 선택 for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { remap[i][j] = map[i][j]; } } //3개의 기둥 세우기 remap[one.first][one.second] = 1; remap[two.first][two.second] = 1; remap[three.first][three.second] = 1; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (remap[i][j] == 2) dfs(i, j); } } //기둥세우고 나서 DFS돌려서 바이러스 전파 시키기 int cnt = 0; //안전 영역 크기 확인 for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (remap[i][j] == 0) cnt++; } } MAX = max(MAX, cnt); } } } printf("%d\n", MAX); return 0; } | cs |
728x90
'<SW> > 알고리즘 + 자료구조' 카테고리의 다른 글
[백트래킹]2661번 좋은수열 (0) | 2018.09.26 |
---|---|
[삼성SWTest준비]14889번 스타트와 링크 (0) | 2018.09.26 |
[BFS] 7576번 토마토 (0) | 2018.08.14 |
[BFS]1697번 숨바꼭질 (0) | 2018.08.13 |
[BFS]2178번 미로탐색 (0) | 2018.08.11 |