• 티스토리 홈
  • 프로필사진
    유니얼
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
유니얼
  • 프로필사진
    유니얼
    • 분류 전체보기 (295)
      • Unity (17)
        • 게임 개발 (5)
      • Unreal (24)
        • 게임 개발 (20)
      • DirectX (36)
      • 코딩테스트 (91)
        • 프로그래머스 (25)
        • 백준 (66)
      • Google Workspace (1)
      • Programing (102)
        • C# (68)
        • C++ (24)
        • JavaScript (10)
      • 게임 서버 프로그래밍 (17)
      • Web (6)
        • 슈퍼코딩 (6)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
    등록된 댓글이 없습니다.
  • 최근 공지
    등록된 공지가 없습니다.
# Home
# 공지사항
#
# 태그
# 검색결과
# 방명록
  • [Baekjoon(백준)][14502번] 연구소(C++)
    2024년 02월 01일
    • 유니얼
    • 작성자
    • 2024.02.01.:51
    728x90

    안녕하세요! 오늘은 코딩테스트 문제 중 하나인 "연구소" 문제를 해결하는 방법에 대해 설명하려고 합니다. 이 문제에서는 바이러스가 있는 연구소에서 벽을 세워 바이러스의 확산을 막고, 안전 영역의 최대 크기를 구하는 문제입니다. 문제를 해결하는 과정과 코드를 자세히 알아보겠습니다.

    문제링크:

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

     

    14502번: 연구소

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

    www.acmicpc.net

    Question_1
    Question_2
    Question_3
    Question_4

    문제 개요

    "연구소" 문제는 바이러스가 있는 연구소에서 벽을 세워 바이러스의 확산을 막고, 안전 영역의 최대 크기를 구하는 문제입니다. 연구소는 N×M 크기의 직사각형으로 나타내며, 바이러스는 상하좌우 인접한 빈 칸으로 퍼질 수 있습니다.

    해결 방법

    이 문제는 깊이 우선 탐색(DFS) 알고리즘을 사용하여 해결할 수 있습니다. 벽을 3개 세우는 모든 경우를 시도하고, 각 경우마다 바이러스를 퍼뜨려 안전 영역의 크기를 계산합니다. 이때, 안전 영역의 최대 크기를 구해야 합니다.

    코드 구현

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int n, m;
    int maps[12][12];
    int visited[12][12];
    
    int dy[] = {-1, 0, 1, 0};
    int dx[] = {0, 1, 0, -1};
    
    vector<pair<int, int>> virus;
    vector<pair<int, int>> wallList;
    
    // 바이러스를 퍼뜨리는 함수
    void dfs(int y, int x) {
        for (int i = 0; i < 4; i++) {
            int ny = y + dy[i];
            int nx = x + dx[i];
            if (ny < 0 || ny >= n || nx < 0 || nx >= m) continue;
            if (visited[ny][nx]) continue;
            if (maps[ny][nx] == 1) continue;
            visited[ny][nx] = true;
            dfs(ny, nx);
        }
        return;
    }
    
    // 안전 영역 크기를 계산하는 함수
    int solve() {
        fill(&visited[0][0], &visited[0][0] + 12 * 12, 0);
        for (pair<int, int> b : virus) {
            visited[b.first][b.second] = true;
            dfs(b.first, b.second);
        }
        int cnt = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (maps[i][j] == 0 && !visited[i][j]) cnt++;
            }
        }
        return cnt;
    }
    
    int main() {
        ios_base::sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);
    
        cin >> n >> m;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                cin >> maps[i][j];
                if (maps[i][j] == 0) wallList.push_back({i, j});
                if (maps[i][j] == 2) virus.push_back({i, j});
            }
        }
        int ret = 0;
        for (int i = 0; i < wallList.size(); i++) {
            for (int y = 0; y < i; y++) {
                for (int x = 0; x < y; x++) {
                    maps[wallList[i].first][wallList[i].second] = 1;
                    maps[wallList[y].first][wallList[y].second] = 1;
                    maps[wallList[x].first][wallList[x].second] = 1;
                    ret = max(ret, solve());
                    maps[wallList[i].first][wallList[i].second] = 0;
                    maps[wallList[y].first][wallList[y].second] = 0;
                    maps[wallList[x].first][wallList[x].second] = 0;
                }
            }
        }
        cout << ret << "\n";
    }

    코드 설명

    위 코드는 벽을 세울 수 있는 모든 위치의 조합을 시도합니다. 각 조합에 대해 바이러스를 퍼뜨리고, 안전 영역의 크기를 계산합니다. 계산된 안전 영역의 크기 중 최대값을 구하여 출력합니다.

    결론

    "연구소" 문제는 깊이 우선 탐색(DFS)과 브루트포스 알고리즘을 결합하여 해결할 수 있습니다. 벽을 세울 수 있는 모든 위치의 조합을 시도하고, 각 경우에 대해 바이러스를 퍼뜨려 안전 영역의 크기를 계산하여 최대값을 구하는 방식으로 해결합니다.

    반응형
    다음글
    다음 글이 없습니다.
    이전글
    이전 글이 없습니다.
    댓글
조회된 결과가 없습니다.
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
목차
표시할 목차가 없습니다.
    • 안녕하세요
    • 감사해요
    • 잘있어요

    티스토리툴바