-
2117.홈 방범 서비스알고리즘/SW Expert Academy 2020. 6. 6. 21:30
이번에 풀어볼 문제는 SW Expert 2117 홈 방범 서비스다. 난이도는 역시나 그렇게 어려운 거같진 않지만
이번에 느낀점은 역시 예외상황을 확인하려면 예시를 잘봐야한다.
이 문제에서 나의 실수는 탐색에 있었다. 이 문제는 전부다 탐색을 해봐야 하는데..
나는 집위주로만 탐색을 했다. 허허허.. 여튼 다시수정했으니 됐지만...
1. 탐색을 언제 끝마칠지 판단해야함 => 서비스 범위가 맵을 넘어서면 정지
2. 언제 최대값을 가져갈지 생각해야함 => 이득 - 운영비용이 적자가 나지 않으면 해당 값을 최대치와 비교
3. 탐색하는 좌표에 집이 있는 경우 => 집 갯수 +1
=> 이 경우만 잘구현해주면 굉장히 쉽게 풀리는 문제이다.
< Code 설명 >
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101#pragma warning(disable:4996)#include <iostream>#include <vector>#include <queue>#include <algorithm>#define MAX 21using namespace std;int T, N, M;int dx[4] = { 0, 0, 1, -1 };int dy[4] = { 1, -1, 0, 0 };int map[MAX][MAX];int check[MAX][MAX];queue<pair<int, int>>q;int answer = 0;void reset_check(){ // check배열과 queue 초기화for (int i = 0; i < MAX; i++){for (int j = 0; j < MAX; j++){check[i][j] = 0;}}int size = q.size();for (int i = 0; i < size; i++)q.pop();}void reset(){ // 변화하는 모든 배열과 변수 초기화for (int i = 0; i < MAX; i++){for (int j = 0; j < MAX; j++){check[i][j] = map[i][j] = 0;}}answer = 0;}int search(int x, int y){ // 탐색q.push(make_pair(x, y)); // 시작 좌표 큐에 pushcheck[x][y] = 1; // 시작 좌표 방문int house = 0; // 집 관련 변수int k = 1; //if (map[x][y]) // 해당 좌표 map 값이 0보다 크면house += 1;// 집이있으니 집갚 +1while (!q.empty()){if (k > N + 1) // N+1보다 K값이 커지면break; // 탐색종료if ((house*M - ((k*k) + (k - 1)*(k - 1))) >= 0) // 집세로 받은 돈보다 운영값이 적으면answer = max(answer, house); // 집 갯수 비교후 최대값 저장int size = q.size(); // 큐에 크기만큼만 탐색for (int j = 0; j < size; j++){int xx = q.front().first;int yy = q.front().second;q.pop();for (int i = 0; i < 4; i++){int ax = xx + dx[i];int ay = yy + dy[i];if (ax < 0 || ay < 0 || ax >= N || ay >= N)continue;if (!check[ax][ay]){ // 방문한적없으면q.push(make_pair(ax, ay)); // 방문으로 체크하고check[ax][ay] = check[xx][yy] + 1; // 방범 운영범위 저장( 디버깅하기 좋게)if (map[ax][ay]){ // 방문한 좌표에 집이있으면house += 1; // 집크기 +1}}}}k++; // 방범 운영 범위 증가}return answer;}int main(){freopen("2117.txt", "r", stdin);cin >> T;for (int z = 1; z <= T; z++){reset(); // 다음 테스트 케이스를 위해 초기화int ans = 0;// 정답변수cin >> N >> M;for (int i = 0; i < N; i++){for (int j = 0; j < N; j++)cin >> map[i][j]; // 맵에 값 입력받기}for (int i = 0; i < N; i++){for (int j = 0; j < N; j++){ans = max(ans, search(i, j)); // 탐색 후 최대값 저장reset_check(); // check 배열만 초기화}}cout << "#" << z << " " << ans << endl;}return 0;}cs 반응형'알고리즘 > SW Expert Academy' 카테고리의 다른 글
5650.핀볼 게임 (0) 2020.06.14 5656.벽돌깨기 (0) 2020.06.12 5653.줄기세포배양 (0) 2020.06.06 1949.등산로 조성 (0) 2020.06.03 5644.무선충전 (0) 2020.06.02 댓글