ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [๋ฐฑ์ค€(BOJ) 1926๋ฒˆ] ๊ทธ๋ฆผ (C++)
    PS(Problem Solving)/C++ 2022. 1. 21. 23:14
    ๋ฐ˜์‘ํ˜•

    ๋ฌธ์ œ ๋งํฌ

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

     

    ๋ฌธ์ œ ์ •๋ณด

    ์ž…๋ ฅ

    ์ฒซ์งธ ์ค„์— ๋„ํ™”์ง€์˜ ์„ธ๋กœ ํฌ๊ธฐ n(1 ≤ n ≤ 500)๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ m(1 ≤ m ≤ 500)์ด ์ฐจ๋ก€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ n+1 ์ค„ ๊นŒ์ง€ ๊ทธ๋ฆผ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (๋‹จ ๊ทธ๋ฆผ์˜ ์ •๋ณด๋Š” 0๊ณผ 1์ด ๊ณต๋ฐฑ์„ ๋‘๊ณ  ์ฃผ์–ด์ง€๋ฉฐ, 0์€ ์ƒ‰์น ์ด ์•ˆ๋œ ๋ถ€๋ถ„, 1์€ ์ƒ‰์น ์ด ๋œ ๋ถ€๋ถ„์„ ์˜๋ฏธํ•œ๋‹ค)

    ์ถœ๋ ฅ

    ์ฒซ์งธ ์ค„์—๋Š” ๊ทธ๋ฆผ์˜ ๊ฐœ์ˆ˜, ๋‘˜์งธ ์ค„์—๋Š” ๊ทธ ์ค‘ ๊ฐ€์žฅ ๋„“์€ ๊ทธ๋ฆผ์˜ ๋„“์ด๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ๋ผ. ๋‹จ, ๊ทธ๋ฆผ์ด ํ•˜๋‚˜๋„ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ฐ€์žฅ ๋„“์€ ๊ทธ๋ฆผ์˜ ๋„“์ด๋Š” 0์ด๋‹ค.

     

    ํ’€์ด

     ์ด์ค‘ for๋ฌธ์„ ํ†ตํ•ด ์‹œ์ž‘์ขŒํ‘œ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ ์žˆ์œผ๋ฉด BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ์†Œ์Šค ์ฝ”๋“œ

    #include <bits/stdc++.h>
    using namespace std;
    
    #define X first
    #define Y second
    
    int board[502][502];
    bool vis[502][502];
    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);
    	
    	int num = 0; // ๊ทธ๋ฆผ์˜ ๊ฐœ์ˆ˜
    	int mx; // ๊ฐ€์žฅ ๋„“์€ ๊ทธ๋ฆผ์˜ ๋„“์ด
    	
    	cin >> n >> m;
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < m; j++) {
    			cin >> board[i][j];
    		}
    	}
    	
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < m; j++) {
    			if (vis[i][j] || board[i][j] != 1) {
    				continue; // ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ๊ฑฐ๋‚˜ ์ƒ‰์น ์ด ์•ˆ ๋œ ๋ถ€๋ถ„์ด๋ฉด ๋„˜์–ด๊ฐ„๋‹ค.
    			}
    			
    			num++;
    			
    			// BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹œ์ž‘! (i, j)๊ฐ€ ์‹œ์ž‘์ขŒํ‘œ
    			queue<pair<int, int>> Q;
    			vis[i][j] = 1;
    			Q.push({i, j});
    			
    			int area = 0; // ๋„“์ด
    			while (!Q.empty()) {
    				area++;
    				
    				auto 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) {
    						continue;
    					}
    					if (vis[nx][ny] || board[nx][ny] != 1) {
    						continue;
    					}
    					
    					vis[nx][ny] = 1;
    					Q.push({nx, ny});
    				}
    			}
    			
    			mx = max(mx, area);
    		}
    	}
    	
    	cout << num << '\n' << mx;
    	
    	return 0;
    }

     

    ๋ฐ˜์‘ํ˜•
Designed by Tistory.