본문 바로가기
Algorithm/C++

[백준 1926] 그림

by imagineer_jinny 2022. 8. 19.

1926번: 그림 (acmicpc.net)

 

1926번: 그림

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

www.acmicpc.net

 

내 풀이

#include <bits/stdc++.h>
using namespace std;

int n, m;
int a[502][502];
bool check[502][502];
int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };
int main() {
   ios::sync_with_stdio(0);
   cin.tie(0);
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> a[i][j]; //입력 어떻게 받는지 유심히 봐
        }
    }

    int cnt=0;
    int marea=0;
    
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(a[i][j]==1&&check[i][j]==false)// false 주의. 0이나 -1 이런거 ㄴㄴ bool type
            {
                cnt++;
                queue<pair<int,int>> q;
                q.push({i,j});
                check[i][j]=true;
                int area=0; // 어!?
                while(!q.empty())
                {
                    area++;
                    int x=q.front().first;
                    int y=q.front().second;
                    
                    q.pop();
                    
                    for(int i=0;i<4;i++)
                    {
                        int nx=x+dx[i];
                        int ny=y+dy[i];
                        
                        if(nx<0|| nx>=n||ny<0||ny>=m)continue;
                        if(a[nx][ny]==0||check[nx][ny]==true)continue;
                        q.push({nx,ny});
                        check[nx][ny]=true;
                    }
                }
                //섬 하나 돌았다는거야
                marea=max(marea,area); // max, min 함수 못쓰네
            }
            //얘 나오면 뭐야?
        }
    }

    cout<<cnt<<'\n'<<marea;
    
}

 

 

정답 풀이

#include <bits/stdc++.h>
using namespace std;

int n, m;
int a[502][502];
bool check[502][502];
int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };
int main() {
   ios::sync_with_stdio(0);
   cin.tie(0);
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> a[i][j];
        }
    }

    int cnt = 0; //그림갯수
    int marea = 0; //가장넓은그림넓이

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {

            if (a[i][j] == 1 && check[i][j] == false)
            {
                cnt++;
                queue<pair<int, int>> q;
                check[i][j] = true;
                q.push(make_pair(i, j));
                int area = 0;
                while (!q.empty())
                {
                    area++;
                    int x = q.front().first;
                    int y = q.front().second;
                    q.pop();
                    for (int i = 0; i < 4; i++)
                    {
                        int nx = x + dx[i];
                        int ny = y + dy[i];

                        if (0 <= nx && nx < n && 0 <= ny && ny < m)
                        {
                            if (a[nx][ny] == 1 && check[nx][ny] == false)
                            {
                                q.push(make_pair(nx, ny));
                                check[nx][ny] = true;
                            }
                        }
                    }
                }
                marea = max(marea, area);
            }
        }
    }
    cout << cnt << '\n' << marea;

}

'Algorithm > C++' 카테고리의 다른 글

[백준 1679] 숨바꼭질  (0) 2022.08.29
[백준 4179] 불!  (0) 2022.08.29
[백준 2504] 괄호의 값  (0) 2022.08.17
[백준 10799] 쇠막대기  (0) 2022.08.17
[백준 1406번] 에디터  (0) 2022.08.10

댓글