반응형
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
- Kafka
- upper_bound
- incr
- 오퍼레터
- 백트래킹
- 이분탐색
- Docker
- OFFSET
- 13908
- dfs
- 퇴사통보
- 처우협의
- 백준
- 경력
- 소프티어
- 파라메트릭
- 매개변수탐색
- 물채우기
- 6987
- 연결요소
- softeer
- 처우산정
- msSQL
- 기술면접
- BOJ
- BFS
- @P0
- 성적평가
- compose
- boj #19237 #어른 상어
Archives
- Today
- Total
기술 블로그
15683번 감시 본문
728x90
반응형
누가봐도 삼성 SW 역량 테스트 문제임을 알 수 있다.
BackTracking + Brute Force 문제이다.
나는 어떻게 접근 해야 하는지도 몰랐다.
몇 시간 동안 계속 생각하다가, 다른 블로거 분의 정답 코드를 많이 참고하였다.
이런 문제 유형을 많이 연습해야겠다는 생각 뿐이다.
더 열심히 노력해야겠다.
https://www.acmicpc.net/problem/15683
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 193 194 195 196 | #include <iostream> #include <queue> #include <cstdio> #include <vector> #include <cstring> #include <string> #include <math.h> #include <algorithm> using namespace std; int N = 0, M = 0; int map[9][9] = { 0, }; int each_cctvCase[6] = { 0, 4, 2, 4, 4, 1 }; // 1 ~ 5 각각의 CCTV 경우의 수 vector<pair<int, int> > cctv; // cctv를 담을 vector int ans = 987654321; // 답 void drawMap(int y, int x, int dy, int dx, int value) { int row = y + dy; int column = x + dx; while (1 <= row && row <= N && 1 <= column && column <= M && map[row][column] != 6) { if (map[row][column] == 0 || map[row][column] >= 100) { map[row][column] += value; } row += dy; column += dx; } } void makeMap(int y, int x, int cctvnumber, int direction, int value) { if (cctvnumber == 1) { if (direction == 1) { drawMap(y, x, 1, 0, value); } else if (direction == 2) { drawMap(y, x, 0, 1, value); } else if (direction == 3) { drawMap(y, x, -1, 0, value); } else if (direction == 4) { drawMap(y, x, 0, -1, value); } } else if (cctvnumber == 2) { if (direction == 1) { drawMap(y, x, 1, 0, value); drawMap(y, x, -1, 0, value); } else if (direction == 2) { drawMap(y, x, 0, 1, value); drawMap(y, x, 0, -1, value); } } else if (cctvnumber == 3) { if (direction == 1) { drawMap(y, x, -1, 0, value); drawMap(y, x, 0, 1, value); } else if (direction == 2) { drawMap(y, x, 0, 1, value); drawMap(y, x, 1, 0, value); } else if (direction == 3) { drawMap(y, x, 1, 0, value); drawMap(y, x, 0, -1, value); } else if (direction == 4) { drawMap(y, x, 0, -1, value); drawMap(y, x, -1, 0, value); } } else if (cctvnumber == 4) { if (direction == 1) { drawMap(y, x, 0, -1, value); drawMap(y, x, -1, 0, value); drawMap(y, x, 0, 1, value); } else if (direction == 2) { drawMap(y, x, -1, 0, value); drawMap(y, x, 0, 1, value); drawMap(y, x, 1, 0, value); } else if (direction == 3) { drawMap(y, x, 0, 1, value); drawMap(y, x, 1, 0, value); drawMap(y, x, 0, -1, value); } else if (direction == 4) { drawMap(y, x, 1, 0, value); drawMap(y, x, 0, -1, value); drawMap(y, x, -1, 0, value); } } else if (cctvnumber == 5) { drawMap(y, x, 1, 0, value); drawMap(y, x, 0, 1, value); drawMap(y, x, -1, 0, value); drawMap(y, x, 0, -1, value); } } int zeroCount() { int ret = 0; for (int i = 1; i <= N; i++) { for (int j = 1; j <= M; j++) { if (map[i][j] == 0) { ++ret; } } } return ret; } void get_Min(int start) { if (start == cctv.size()) { ans = min(ans, zeroCount()); // 사각 지대 최소 크기 구하기 return; } int y = cctv[start].first; int x = cctv[start].second; int cctvNumber = map[y][x]; for (int i = 1; i <= each_cctvCase[cctvNumber]; i++) { // BackTracking makeMap(y, x, cctvNumber, i, 100); get_Min(start + 1); makeMap(y, x, cctvNumber, i, -100); // map을 다시 원래대로 되돌리기 위함 } } int main(void) { scanf("%d %d", &N, &M); for (int i = 1; i <= N; i++) { for (int j = 1; j <= M; j++) { scanf("%d", &map[i][j]); if (1 <= map[i][j] && map[i][j] <= 5) { cctv.push_back({ i, j }); } } } get_Min(0); printf("%d\n", ans); return 0; } | cs |
728x90
반응형
'알고리즘 문제 > BOJ' 카테고리의 다른 글
2580번 스도쿠 (0) | 2018.08.22 |
---|---|
11559번 Puyo Puyo (0) | 2018.08.22 |
11053번 가장 긴 증가하는 부분 수열 (0) | 2018.08.22 |
7562번 나이트의 이동 (0) | 2018.08.22 |
2206번 벽 부수고 이동하기 (0) | 2018.08.21 |