둠치킨
코딩하는 둠치킨
둠치킨

블로그 메뉴

  • 홈
  • 분류 전체보기 (223)
    • BOJ (176)
      • 스택 (14)
      • 큐 (5)
      • 덱 (4)
      • 그래프 (31)
      • 배열 (8)
      • 재귀 (12)
      • 브루트 포스 (2)
      • 그리디 알고리즘 (7)
      • 다이내믹 프로그래밍 (14)
      • 백트래킹 (24)
      • 기하학 (4)
      • 트리 (4)
      • 구현 (14)
      • 수학 (3)
      • 맵 (1)
      • 다익스트라 (2)
      • 누적합 (5)
      • 유니온 파인드 (1)
      • 분할 정복 (2)
    • 자료구조 (14)
      • 스택 (3)
      • 큐 (5)
      • 덱 (2)
      • 그래프 (1)
      • 트리 (1)
      • 힙 (1)
      • 정렬 (1)
    • C++ (11)
      • 모두의코드 (2)
      • Effective C++ (3)
      • C++ STL (6)
    • 컴파일러 (1)
    • OS (17)
    • 컴퓨터 구조 (2)
    • Unreal Engine 5 (2)

공지사항

전체 방문자
오늘
어제

인기 글

최근 글

태그

  • BFS
  • boj
  • Bruteforce
  • C
  • C++
  • C++ STL
  • Cache Memory
  • deadlock
  • DFS
  • Effective C++
  • java
  • Mutex
  • next_permutation
  • os
  • Process
  • rotate
  • semaphore
  • spin lock
  • STL
  • STL C++
hELLO · Designed By 정상우.
둠치킨

코딩하는 둠치킨

BOJ/그래프

1926번: 그림 (BOJ C/C++)

2022. 3. 13. 22:38

1926번: 그림

사용 언어: C++

 

문제

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

입력

첫째 줄에 도화지의 세로 크기 n(1 ≤ n ≤ 500)과 가로 크기 m(1 ≤ m ≤ 500)이 차례로 주어진다. 두 번째 줄부터 n+1 줄 까지 그림의 정보가 주어진다. (단 그림의 정보는 0과 1이 공백을 두고 주어지며, 0은 색칠이 안된 부분, 1은 색칠이 된 부분을 의미한다)

출력

첫째 줄에는 그림의 개수, 둘째 줄에는 그 중 가장 넓은 그림의 넓이를 출력하여라. 단, 그림이 하나도 없는 경우에는 가장 넓은 그림의 넓이는 0이다.

 

풀이

바킹독 강의를 듣다가 풀라고 하신 기본 문제인데 바킹독 풀이는 visited[][] 배열까지 사용해서 그 칸을 방문했는지 안 했는지 확인하는데 BFS 문제들은 굳이 visited 없이도 graph 배열 하나로 충분하고 그러면 메모리까지 덜 써서 visited이 없는 코드를 짜보았다.

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second // pair에서 first, second를 줄여서 쓰기 위해서 사용
int graph[502][502]; // 1이 파란 칸, 0이 빨간 칸에 대응

int n,m;
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1}; // 상하좌우 네 방향을 의미

int main(void)
{
    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 >> graph[i][j];
            
    int mx = 0; // 그림의 최댓값
    int num = 0; // 그림의 수
    for(int i = 0; i < n; i++)
    {
    	for(int j = 0; j < m; j++)
    	{
    		if(graph[i][j] == 0) continue; // 해당 칸이 색칠이 안된 부분(0)
            num++; // 그림의 수 1 증가
            queue<pair<int,int> > Q;
            graph[i][j] = 0;
            Q.push({i,j});
            int area = 0; // 그림의 넓이
            while(!Q.empty())
            {
                area++; // 큐에 들어있는 원소를 하나 뺄 때 마다 넓이를 1 증가시킴
                pair<int,int> cur = Q.front(); Q.pop();
                for(int dir = 0; dir < 4; dir++)
                {
                    int nx = cur.X + dx[dir];
                    int ny = cur.Y + dy[dir];
                    if(nx<0 || nx >= n || ny<0 || ny >= m || graph[nx][ny] != 1) continue;
                    graph[nx][ny] = 0;
                    Q.push({nx,ny});
                }
            }

        mx = max(mx, area);
        }
    }
    cout << num << '\n' << mx;

    return 0;
}
저작자표시 (새창열림)

'BOJ > 그래프' 카테고리의 다른 글

1697번: 숨바꼭질 (BOJ C/C++)  (0) 2022.03.29
4179번: 불! (BOJ C/C++)  (0) 2022.03.15
1012번: 유기농 배추 (BOJ C/C++)  (0) 2022.03.09
16236번: 아기 상어 (BOJ C/C++)  (0) 2022.03.04
2606번: 바이러스 (BOJ C/C++)  (0) 2022.02.19
    'BOJ/그래프' 카테고리의 다른 글
    • 1697번: 숨바꼭질 (BOJ C/C++)
    • 4179번: 불! (BOJ C/C++)
    • 1012번: 유기농 배추 (BOJ C/C++)
    • 16236번: 아기 상어 (BOJ C/C++)
    둠치킨
    둠치킨
    코딩 공부를 위한 코딩 블로그 기록 일기

    티스토리툴바