일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- OFFSET
- 처우협의
- 경력
- 물채우기
- upper_bound
- 소프티어
- 처우산정
- BOJ
- 백준
- 백트래킹
- BFS
- 성적평가
- 연결요소
- 파라메트릭
- Kafka
- Docker
- msSQL
- incr
- 매개변수탐색
- 오퍼레터
- 13908
- 6987
- 기술면접
- compose
- boj #19237 #어른 상어
- @P0
- 이분탐색
- dfs
- 퇴사통보
- softeer
- Today
- Total
기술 블로그
2382번 미생물 격리 본문
재미있는 문제였다.
생각했던 것보다 조건이 1 ~ 2개 정도 더 많아서, 생각을 좀 요구하는 문제였다.
난이도는 어렵지는 않았다.
하여튼 문제는 다 풀었다고 생각하여서, 제출을 해봤는데 오류가 발생한 것이다.
분명, 내 Visual Studio 2017에서는 오류 발생없이,
sample_input.txt에 있는 예제 10개 모두 잘 실행되었고, 답도 맞았다.
이유를 보아하니 vector인 v에 push_back을 할 때,
각 변수에 대한 타입 매칭(?)이 안 맞는 것 같은데, 분명 타입도 다 맞게 설정하였는데도 그렇다.
그래서, 어쩔 수 없이 vector v를 배열 형태로 선언하여, resize해주고 난 후에 풀었더니 PASS가 떴다.
이 문제에서 기억해야할 것(PASS 뜬 코드 기준)
1. 조건을 잘 생각해봐야한다.
2. 131 ~ 138번 째 코드에서 v[update[s]]라고 해야하는데, 생각없이 v[s]라고 하였었다.
3. 100, 112번 째 줄 코드에서 군집이 살아 있을 때도 생각해줘야하는데, 단순 '사용 여부'만 생각했었다.
https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV597vbqAH0DFAVl&
<SW Expert Academy에 제출하였을 때, 발생한 오류>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 제출 오류 컴파일 오류 : 오류 메세지 : solution.cpp: In function ‘int main()’: solution.cpp:162:40: error: no matching function for call to ‘std::vector<microorganism>::push_back(<brace-enclosed initializer list>)’ v.push_back({ R, C, Cnt, Dir, true }); ^ solution.cpp:162:40: note: candidates are: In file included from /usr/include/c++/4.8.2/vector:64:0, from /usr/include/c++/4.8.2/queue:61, solution.cpp:2: /usr/include/c++/4.8.2/bits/stl_vector.h:901:7: note: void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = microorganism; _Alloc = std::allocator<microorganism>; std::vector<_Tp, _Alloc>::value_type = microorganism] push_back(const value_type& __x) ^ /usr/include/c++/4.8.2/bits/stl_vector.h:901:7: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘const value_type& {aka const microorganism&}’ /usr/include/c++/4.8.2/bits/stl_vector.h:919:7: note: void std::vector<_Tp, _Alloc>::push_back(std::vector<_Tp, _Alloc>::value_type&&) [with _Tp = microorganism; _Alloc = std::allocator<microorganism>; std::vector<_Tp, _Alloc>::value_type = microorganism] push_back(value_type&& __x) ^ /usr/include/c++/4.8.2/bits/stl_vector.h:919:7: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘std::vector<microorganism>::value_type&& {aka microorganism&&}’ | cs |
<SW Expert Academy에 제출하였을 때, 오류가 발생한 코드(VS에서는 정상 작동)>
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 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 | #include <iostream> #include <queue> #include <cstdio> #include <vector> #include <cstring> #include <string> #include <math.h> #include <algorithm> using namespace std; typedef struct microorganism // 미생물 { int r = 0; // 세로 위치 int c = 0; // 가로 위치 int micro_count = 0; // 미생물 수 int direction = 0; // 이동 방향, 상: 1, 하: 2, 좌: 3, 우: 4 bool live = true; // 살아있는지 여부 }microorganism; int N = 0, M = 0, K = 0; int map[101][101] = { 0, }; vector<microorganism> v; void move() { for (int i = 0; i < K; i++) { if (v[i].live) // 미생물이 살아있다면 { if (v[i].direction == 1) // 상 { --v[i].r; if (v[i].r == 0 || v[i].r == N - 1 || v[i].c == 0 || v[i].c == N - 1) // 약품 구역이라면 { v[i].micro_count /= 2; v[i].direction = 2; if (v[i].micro_count == 0) { v[i].live = false; } } } else if (v[i].direction == 2) // 하 { ++v[i].r; if (v[i].r == 0 || v[i].r == N - 1 || v[i].c == 0 || v[i].c == N - 1) // 약품 구역이라면 { v[i].micro_count /= 2; v[i].direction = 1; if (v[i].micro_count == 0) { v[i].live = false; } } } else if (v[i].direction == 3) // 좌 { --v[i].c; if (v[i].r == 0 || v[i].r == N - 1 || v[i].c == 0 || v[i].c == N - 1) // 약품 구역이라면 { v[i].micro_count /= 2; v[i].direction = 4; if (v[i].micro_count == 0) { v[i].live = false; } } } else if (v[i].direction == 4) // 우 { ++v[i].c; if (v[i].r == 0 || v[i].r == N - 1 || v[i].c == 0 || v[i].c == N - 1) // 약품 구역이라면 { v[i].micro_count /= 2; v[i].direction = 3; if (v[i].micro_count == 0) { v[i].live = false; } } } } } vector<int> update; bool used[1000 + 1] = { false, }; memset(used, false, sizeof(used)); for (int i = 0; i < K; i++) { if (used[i] || !v[i].live) continue; // 사용되었거나 죽었다면 무시 int max_count = 0, max_index = 0; update.push_back(i); max_count = v[i].micro_count; max_index = i; for (int j = 0; j < K; j++) { if (i != j) { if (v[j].live && v[i].r == v[j].r && v[i].c == v[j].c) { update.push_back(j); if (max_count < v[j].micro_count) { max_count = v[j].micro_count; max_index = j; } } } } int update_size = update.size(); if (update_size > 1) { for (int s = 0; s < update_size; s++) { if (update[s] != max_index) { v[update[s]].live = false; v[max_index].micro_count += v[update[s]].micro_count; } used[update[s]] = true; // 사용 표시 } } if (!update.empty()) update.clear(); } } int main(void) { int T = 0; scanf("%d", &T); for (int tc = 1; tc <= T; tc++) { int R = 0, C = 0, Cnt = 0, Dir = 0, result = 0; scanf("%d %d %d", &N, &M, &K); for(int i=0; i<K; i++) { scanf("%d %d %d %d", &R, &C, &Cnt, &Dir); v.push_back({ R, C, Cnt, Dir, true }); } while (M--) { move(); } for (int i = 0; i < K; i++) { if (v[i].live) { result += v[i].micro_count; } } v.clear(); printf("#%d %d\n", tc, result); } return 0; } | cs |
<PASS 뜬 코드, 추가 및 수정 부분은 표시하였음>
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 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | #include <iostream> #include <queue> #include <cstdio> #include <vector> #include <cstring> #include <string> #include <math.h> #include <algorithm> using namespace std; typedef struct microorganism // 미생물 { int r = 0; // 세로 위치 int c = 0; // 가로 위치 int micro_count = 0; // 미생물 수 int direction = 0; // 이동 방향, 상: 1, 하: 2, 좌: 3, 우: 4 bool live = true; // 살아있는지 여부 }microorganism; int N = 0, M = 0, K = 0; int map[101][101] = { 0, }; vector<microorganism> v; void move() { for (int i = 0; i < K; i++) { if (v[i].live) // 미생물이 살아있다면 { if (v[i].direction == 1) // 상 { --v[i].r; if (v[i].r == 0 || v[i].r == N - 1 || v[i].c == 0 || v[i].c == N - 1) // 약품 구역이라면 { v[i].micro_count /= 2; v[i].direction = 2; if (v[i].micro_count == 0) { v[i].live = false; } } } else if (v[i].direction == 2) // 하 { ++v[i].r; if (v[i].r == 0 || v[i].r == N - 1 || v[i].c == 0 || v[i].c == N - 1) // 약품 구역이라면 { v[i].micro_count /= 2; v[i].direction = 1; if (v[i].micro_count == 0) { v[i].live = false; } } } else if (v[i].direction == 3) // 좌 { --v[i].c; if (v[i].r == 0 || v[i].r == N - 1 || v[i].c == 0 || v[i].c == N - 1) // 약품 구역이라면 { v[i].micro_count /= 2; v[i].direction = 4; if (v[i].micro_count == 0) { v[i].live = false; } } } else if (v[i].direction == 4) // 우 { ++v[i].c; if (v[i].r == 0 || v[i].r == N - 1 || v[i].c == 0 || v[i].c == N - 1) // 약품 구역이라면 { v[i].micro_count /= 2; v[i].direction = 3; if (v[i].micro_count == 0) { v[i].live = false; } } } } } vector<int> update; bool used[1000 + 1] = { false, }; memset(used, false, sizeof(used)); for (int i = 0; i < K; i++) { if (used[i] || !v[i].live) continue; // 사용되었거나 죽었다면 무시 int max_count = 0, max_index = 0; update.push_back(i); max_count = v[i].micro_count; max_index = i; for (int j = 0; j < K; j++) { if (i != j) { if (v[j].live && v[i].r == v[j].r && v[i].c == v[j].c) { update.push_back(j); if (max_count < v[j].micro_count) { max_count = v[j].micro_count; max_index = j; } } } } int update_size = update.size(); if (update_size > 1) { for (int s = 0; s < update_size; s++) { if (update[s] != max_index) { v[update[s]].live = false; v[max_index].micro_count += v[update[s]].micro_count; } used[update[s]] = true; // 사용 표시 } } if (!update.empty()) update.clear(); } } int main(void) { int T = 0; scanf("%d", &T); for (int tc = 1; tc <= T; tc++) { int R = 0, C = 0, Cnt = 0, Dir = 0, result = 0; scanf("%d %d %d", &N, &M, &K); // 추가한 부분 v.resize(K); for (int i = 0; i<K; i++) { scanf("%d %d %d %d", &R, &C, &Cnt, &Dir); // 수정한 부분 v[i].r = R; v[i].c = C; v[i].micro_count = Cnt; v[i].direction = Dir; v[i].live = true; } while (M--) { move(); } for (int i = 0; i < K; i++) { if (v[i].live) { result += v[i].micro_count; } } v.clear(); printf("#%d %d\n", tc, result); } return 0; } | cs |
<sample input>
10
7 2 9
1 1 7 1
2 1 7 1
5 1 5 4
3 2 8 4
4 3 14 1
3 4 3 3
1 5 8 2
3 5 100 1
5 5 1 1
10 17 46
7 5 724 2
7 7 464 3
2 2 827 2
2 4 942 4
4 5 604 4
7 2 382 1
6 5 895 3
8 7 538 4
6 1 299 4
4 7 811 4
3 6 664 2
6 8 868 2
7 6 859 2
4 6 778 2
5 4 842 3
1 3 942 1
1 1 805 3
3 2 350 3
2 5 623 2
5 3 840 1
7 1 308 4
1 8 323 3
2 3 82 3
2 6 115 2
8 3 930 1
6 2 72 1
2 1 290 3
4 8 574 4
8 5 150 3
8 2 287 2
2 8 909 2
2 7 588 2
7 3 30 3
5 8 655 3
3 8 537 1
4 2 350 3
5 6 199 1
5 5 734 2
3 3 788 1
8 4 893 1
1 4 421 4
6 3 616 2
1 2 556 4
7 8 8 1
5 2 702 2
4 4 503 3
10 5 28
3 3 796 1
7 2 798 2
2 6 622 1
3 5 179 3
7 8 888 4
5 8 634 3
1 8 646 1
3 7 433 4
6 7 416 1
2 7 651 3
6 4 476 2
5 6 712 4
1 7 869 4
6 1 789 2
8 8 585 3
7 6 426 1
1 5 154 2
1 2 692 1
2 4 549 3
2 1 60 2
4 8 996 4
8 2 437 2
3 6 195 2
1 3 734 4
3 8 355 2
1 1 945 1
2 5 558 2
7 7 144 2
10 22 26
2 2 450 4
6 3 659 1
5 8 24 2
3 7 649 2
3 2 22 3
1 3 905 4
7 8 625 3
6 7 824 3
7 3 159 1
2 7 297 4
7 2 270 2
4 5 985 1
7 1 627 2
3 4 625 4
8 5 972 4
6 6 432 4
6 8 142 1
7 7 900 1
4 1 974 2
4 2 760 4
1 4 550 2
5 7 624 4
4 6 694 1
4 3 593 3
3 1 152 4
1 8 926 1
10 7 15
3 4 227 1
4 7 109 1
3 7 487 2
2 3 627 2
6 1 520 4
7 3 596 4
2 6 525 4
1 5 116 3
7 7 771 4
4 4 520 2
7 5 763 1
5 4 829 3
5 2 578 3
6 8 200 2
3 8 760 4
10 24 12
6 5 887 2
2 3 428 1
2 1 540 2
8 1 356 4
1 7 485 4
5 1 357 3
7 6 271 2
6 2 22 1
6 1 41 2
8 2 565 2
8 5 855 1
6 3 734 1
10 22 44
2 2 963 1
8 4 635 4
4 1 938 4
8 7 511 3
6 8 825 4
6 7 934 3
3 7 701 4
2 7 534 2
5 2 705 1
3 5 300 2
6 2 855 4
7 7 877 4
1 7 443 1
1 2 313 1
3 3 932 2
1 8 831 2
1 1 90 2
2 6 145 3
2 3 740 4
5 3 759 4
1 6 181 1
8 6 608 4
5 6 556 2
2 4 541 4
2 1 174 2
6 1 601 1
7 5 84 4
4 3 970 3
8 8 503 1
3 4 171 3
5 7 913 4
8 1 232 3
7 6 539 4
3 8 648 1
8 2 944 2
2 5 508 2
5 1 87 1
5 8 88 4
2 8 681 2
1 5 758 2
3 1 690 3
6 4 620 3
5 4 783 1
6 6 748 1
10 9 38
2 7 955 1
7 7 25 4
4 2 496 2
1 4 342 1
7 5 72 1
3 7 429 2
5 2 812 3
8 6 36 2
1 6 994 3
1 5 838 1
3 4 131 4
7 2 11 2
6 3 650 3
7 3 353 2
1 7 454 2
8 3 256 4
5 5 213 2
6 5 80 1
2 1 676 4
4 6 561 3
2 5 653 3
3 5 923 3
8 2 259 3
4 4 781 2
1 1 313 2
3 6 938 3
2 6 700 3
4 1 215 2
4 8 39 3
5 1 954 3
6 7 774 1
5 8 541 4
3 1 885 4
7 8 867 2
2 8 825 1
5 6 598 3
6 6 80 3
8 1 405 2
10 16 11
5 7 87 3
2 5 686 1
6 7 64 2
6 8 873 3
5 6 762 2
8 4 268 3
7 3 307 4
1 7 809 3
5 5 293 3
5 1 345 3
4 1 114 4
10 8 19
3 1 52 4
6 8 423 3
7 3 498 4
7 5 633 3
7 7 392 3
6 6 458 4
3 8 830 3
5 1 799 3
1 1 540 3
4 8 567 3
1 6 897 3
5 4 230 1
2 6 229 3
1 5 147 1
4 1 754 2
3 3 569 1
7 8 515 4
2 4 528 4
2 1 962 2
10 24 36
6 6 923 3
7 6 910 2
2 1 278 2
2 5 164 3
8 6 505 4
2 8 970 1
1 1 85 2
1 6 194 1
5 3 572 1
7 4 611 4
6 2 565 4
1 3 609 4
1 7 74 2
6 5 573 4
5 1 31 3
7 7 779 3
7 1 391 3
8 5 364 3
7 8 474 1
5 6 547 3
2 6 195 2
3 7 754 4
1 8 912 1
3 8 415 1
5 8 434 4
5 7 958 4
2 7 700 3
4 5 974 1
4 7 376 4
3 1 111 1
3 6 486 1
8 4 545 1
5 2 237 3
4 2 850 2
2 4 793 2
6 3 877 2
20 5 30
1 14 823 3
6 14 595 4
10 6 1310 3
13 7 1487 3
15 3 258 4
14 15 1286 4
7 7 1128 1
3 10 1503 3
18 8 1881 3
6 17 598 3
1 16 756 4
18 11 1435 2
12 18 1386 3
4 9 48 3
1 9 1840 2
17 8 1599 3
12 5 1328 3
13 12 1794 1
3 1 1432 4
14 9 1497 1
6 2 841 4
10 9 648 1
2 16 633 3
12 3 1990 3
12 6 578 1
8 1 1487 1
6 13 193 1
11 10 1834 1
5 16 529 2
5 14 1392 4
<sample output>
#1 145
#2 5507
#3 9709
#4 2669
#5 3684
#6 774
#7 4797
#8 8786
#9 1374
#10 5040
'알고리즘 문제 > SW Expert Academy' 카테고리의 다른 글
2117번 홈 방범 서비스 (0) | 2018.09.01 |
---|---|
2105번 디저트 카페 (0) | 2018.08.31 |
1952번 수영장 (0) | 2018.08.27 |
1953번 탈주범 검거 (0) | 2018.08.25 |
2383번 점심 식사시간 (0) | 2018.08.25 |