HOIT_B

[ 백준 C++ ]1926 그림 본문

작고소중한 알고리즘 풀기

[ 백준 C++ ]1926 그림

HOIT_77 2023. 11. 1. 16:59
728x90

C++ 공부하기! 

문제 

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

 

1926번: 그림

어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로

www.acmicpc.net

C++ 공부가 목표이기 때문에 풀이X 

Vector의 사용을 위해선 <vector>헤더 파일을 추가해야한다. 

선언은 vector <데이터 타입> 변수이름; 

 

*max_element사용하기 위해서는 <algorithm> 헤더 파일 추가해야한다.

*max_element사용하면 [시작, 끝) 범위 중 가장 큰 값의 value를 반환한다. 

 

코드 

#include <iostream>
#include <algorithm>
#include <queue>
#include <utility>
#include <vector>

using namespace std;

int n,m;
int picture[501][501];
int visit[501][501];

// 현재위치의 상,하,좌,우를 살피기 위함
int x[4] = {0,0,1,-1};
int y[4] = {1,-1,0,0};

int bfs(int s1,int s2)
{
    int funcnt = 0;
    queue <pair <int,int>>q; 
    
    //큐에 현재 위치를 넣는다.
    q.push(make_pair(s1,s2));
    
    while(!q.empty())
    {
        funcnt++;
        
        pair<int,int> now = q.front();
        q.pop();
        
        //범위안에서 현재 위치의 상,하,좌,우에 1이 있는지 찾음
        //있다면 큐에 위치를 넣어줌 
        for(int i=0;i<4; i++)
        {
            int py = now.first+y[i];
            int px = now.second  + x[i];
            if(0<= py & py < n & 0<= px & px < m & visit[py][px] == 0 & picture[py][px] == 1){
                visit[py][px] = 1;
                q.push(make_pair(py,px));
            }
        }
    }
    return funcnt;
}

int main()
{
    int cnt =0;
    cin >> n >> m;
    
    //vector container는 자동으로 메모리가 할당되는 배열이다.
    //vector의 선언은 - vector<[data type]> [변수이름] 
    vector <int> v;

    v.push_back(0);  //마지막 원소 뒤에 원소 0을 삽입한다.
    
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            cin >> picture[i][j];
        }
    }
    
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            if(picture[i][j] == 1 & visit[i][j] == 0){
                visit[i][j] = 1;
                v.push_back(bfs(i,j));
                cnt += 1;
            }
        }
    }
    cout << cnt <<endl;
    //v 벡터의 시작부터 끝부분까지 중 최대를 출력한다.
    cout << *max_element(v.begin(),v.end());
    
}
728x90
Comments