Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 이런게4문제
- 삼성
- C++
- 백준
- 브루트포스
- 2018
- 프로그래머스
- 레벨2
- 문자열
- 삼성SW역량테스트
- find
- 시뮬레이션
- 완전탐색
- STL
- 코딩테스트
- 삼성SW테스트
- Set
- 레벨3
- priority_queue
- dfs
- 모의SW역량테스트
- 백트래킹
- swea
- KAKAO
- substr
- BFS
- dp
- Map
- Sort
- 코딩스킬
Archives
- Today
- Total
-
[SWEA_모의SW역량테스트] 1953번 - 탈주범 검거 본문
SWEA 삼성 SW 모의 역량테스트 문제다.
전형적인 BFS 문제로, 갈 수 있는 길을 가고, 가지 않은 길을 가면서 탈주범이 최대 갈 수 있는 지역의 수를 구하는 문제다.
Map을 단순히 숫자로 표현하기보다는 상하좌우 접근가능한 정보를 저장하는 것이 구현하기 용이하여 구조체 Open을 사용하였으며, 4방위 탐색을 BFS에서 활용할 때 가장 기본이 되는 dir 구조체를 선언해 활용했다.
그리고 단계별 탐색이 되어야하는 BFS 문제이기 때문에, 루프를 돌 때마다 큐의 크기만큼만 반복문을 돌고 time을 증가시킨 뒤, L과 비교해 무한루프를 빠져나왔다.
L이 1일경우, 맨홀 입구아래 부분만 있을 수 있으므로 답을 1로 하여 출력하도록 하였다.
아래는 소스코드.
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
|
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
int T, N, M, R, C, L;
typedef struct Open{
bool up = false;
bool down = false;
bool left = false;
bool right = false;
}Open;
typedef struct dir{
int dr, dc;
}dir;
dir direction[4] = { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };
vector<vector<bool> > check;
vector<vector<Open> > Map;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> T;
for (int tc = 1; tc <= T; tc++){
cin >> N >> M >> R >> C >> L;
// L = 1일 때 맨홀 뚜껑 위치이며 지점 한 개에 있을 수 있는 것.
Open tmp;
for (int r = 0; r < N; r++){
for (int c = 0; c < M; c++){
int ele;
cin >> ele;
if (ele > 0){
switch (ele){
case 1: // 상하좌우
Map[r][c].up = true;
Map[r][c].down = true;
Map[r][c].left = true;
Map[r][c].right = true;
break;
case 2: // 상하
Map[r][c].up = true;
Map[r][c].down = true;
break;
case 3: // 좌우
Map[r][c].left = true;
Map[r][c].right = true;
break;
case 4: // 상우
Map[r][c].up = true;
Map[r][c].right = true;
break;
case 5: // 하우
Map[r][c].down = true;
Map[r][c].right = true;
break;
case 6: // 좌하
Map[r][c].left = true;
Map[r][c].down = true;
break;
case 7: // 좌상
Map[r][c].left = true;
Map[r][c].up = true;
break;
}
}
}
}
int answer = 1;
int time = 1;
queue<pair<int, int> > q;
q.push(make_pair(R, C));
check[R][C] = true;
int level;
while (1){
if (L == 1) break;
int cnt = q.size();
for (int k = 0; k < cnt; k++){
pair<int, int> curPos = q.front();
q.pop();
for (int i = 0; i < 4; i++){ // 동 서 남 북
int nR = curR + direction[i].dr;
int nC = curC + direction[i].dc;
if (0 <= nR && nR < N && 0 <= nC && nC < M){
if (i == 0){
if (Map[curR][curC].right && Map[nR][nC].left && !check[nR][nC]){
check[nR][nC] = true;
answer++;
q.push(make_pair(nR, nC));
}
}
else if (i == 1){
if (Map[curR][curC].left && Map[nR][nC].right && !check[nR][nC]){
check[nR][nC] = true;
answer++;
q.push(make_pair(nR, nC));
}
}
else if (i == 2){
if (Map[curR][curC].down && Map[nR][nC].up && !check[nR][nC]){
check[nR][nC] = true;
answer++;
q.push(make_pair(nR, nC));
}
}
else if (i == 3){
if (Map[curR][curC].up && Map[nR][nC].down && !check[nR][nC]){
check[nR][nC] = true;
answer++;
q.push(make_pair(nR, nC));
}
}
}
}
}
time++;
if (time == L) break;
}
cout << "#" << tc << " " << answer << '\n';
}
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
'1-2. SWEA' 카테고리의 다른 글
[SWEA_D3] 1244번 - 최대 상금 (0) | 2020.03.15 |
---|---|
[SWEA_모의SW역량테스트] 2105번 - 디저트 카페 (0) | 2020.02.27 |
[SWEA_모의SW역량테스트] 4013번 - 특이한 자석 (0) | 2020.01.28 |
[SWEA_모의SW역량테스트] 4014번 - 활주로 건설 (0) | 2020.01.27 |
[SWEA_모의SW역량테스트] 5644번 - 무선충전 (0) | 2020.01.27 |
Comments