[백준] 14502 연구소(C++)

2022. 6. 25. 21:05·Algorithm/Solution
728x90

https://www.acmicpc.net/problem/14502

 

14502번: 연구소

인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크

www.acmicpc.net


난이도 : 골드 5

 

풀이 과정 :

최근에 코테를 몇번 참가해보면서 구현을 정확하고 빠르게 푸는 것의 중요성을 깨달았다.

이 문제는 구현+bfs인데, 백준에서 bfs문제중 바이러스 문제가 있어서 그거 먼저 풀면 도움이 될듯하다.

n과 m이 최대 8까지기 때문에 완탐! 으로 가능하다 

왜냐면 0이나올수 있는 곳에 벽 3개를 두는 것이기 때문에 최대 64C3 번 연산 이기 때문

관건은 벽 3개를 두는 방법을 어떻게 구현하는 가인데 그냥 고민하다가 6중반복문을 이용해서 해봤다..

만약 세 좌표중 두개 같으면 넘어가고, 세개 다 다른 좌표이고, 0일때만 bfs가 돌아가도록 하였음

 

코드 :

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;

int n, m, arr[10][10], arr2[10][10], ans;
int dx[4] = { 0, 0, 1, -1};
int dy[4] = { 1, -1, 0, 0 };

queue<pair<int,int>> q;
int bfs(){
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(arr[i][j] == 2) q.push(make_pair(i,j));
        }
    }
    while (!q.empty()) {
        int xx=  q.front().first;
        int yy = q.front().second;
        q.pop();
        for (int i = 0; i < 4; i++) {
            int nx = xx + dx[i];
            int ny = yy + dy[i];
            if (ny >= 0 && nx >= 0 && nx < n && ny < m && arr2[nx][ny] == 0) {
                arr2[nx][ny] = 2;
                q.push(make_pair(nx, ny));                  
            }
        }
    }   
    int cnt = 0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(arr2[i][j] == 0) cnt++;
        }
    }  
    return cnt;
}

int main()
{   
    cin >> n >> m;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin >> arr[i][j];
        }
    }
    
    for(int x1=0;x1<n;x1++){
        for(int y1=0;y1<m;y1++){
            for(int x2=0;x2<n;x2++){
                for(int y2=0;y2<m;y2++){
                    for(int x3=0;x3<n;x3++){
                        for(int y3=0;y3<m;y3++){
                            if((x1==x2 && y1==y2) || (x2==x3 && y2==y3) || (x1==x3 && y1==y3)) continue;
                            if(arr[x1][y1] == 0 && arr[x2][y2] ==0 && arr[x3][y3] == 0){                                
                                copy(&arr[0][0], &arr[0][0]+100, &arr2[0][0]);
                                arr2[x1][y1] =1, arr2[x2][y2] =1, arr2[x3][y3] =1;
                                ans = max(bfs(), ans);
                            }
                        }
                    }
                }
            }
        }
    }    
    cout << ans;   
}

 

728x90
저작자표시 비영리 (새창열림)

'Algorithm > Solution' 카테고리의 다른 글

[백준] 15686 치킨 배달(C++)  (0) 2022.07.28
[백준] 2623 음악 프로그램(C++)  (0) 2022.07.15
[백준] 2110 공유기 설치(C++)  (0) 2022.06.08
[백준] 14500번 테트로미노(C++)  (0) 2022.06.02
[백준] 4485 녹색 옷 입은 애가 젤다지? (C++)  (0) 2022.05.28
'Algorithm/Solution' 카테고리의 다른 글
  • [백준] 15686 치킨 배달(C++)
  • [백준] 2623 음악 프로그램(C++)
  • [백준] 2110 공유기 설치(C++)
  • [백준] 14500번 테트로미노(C++)
BeNI
BeNI
코딩하는 블로그
  • BeNI
    코딩못하는컴공
    BeNI
  • 전체
    오늘
    어제
    • Menu (253)
      • My profile (1)
      • 회고 | 후기 (8)
      • Frontend (65)
        • Article (11)
        • Study (35)
        • 프로그래머스 FE 데브코스 (19)
      • Backend (0)
      • Algorithm (58)
        • Solution (46)
        • Study (12)
      • Major (111)
        • C&C++ (23)
        • Java (20)
        • Data Structure (14)
        • Computer Network (12)
        • Database (15)
        • Linux (6)
        • Architecture (3)
        • Lisp (15)
        • OS (1)
        • Security (2)
      • etc (2)
  • 링크

    • 깃허브
    • 방명록
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 태그

    데브코스
    react
    프로그래머스
    백준
    자료구조
    lisp
    파일처리
    C++
    Algorithm
    리팩토링
  • hELLO· Designed By정상우.v4.10.2
BeNI
[백준] 14502 연구소(C++)
상단으로

티스토리툴바