[2667] 단지번호 붙이기

!·2022년 7월 5일
0

BFS/DFS

목록 보기
12/17

내 코드

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

int field[25][25];
bool isvisit[25][25];
int xdis[4] = {1,0,-1,0};
int ydis[4] = {0,1,0,-1};

int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t; cin >> t;
    for(int i = 0;i<t;i++)
    {
        string s;
        cin >> s;
        for(int j = 0;j<t;j++)
        {
            field[i][j] = s[j] -'0';
        }
    }
    queue<pair<int,int>> q;
    deque<int> d;
    int ans = 0;
    int sum = 1;
    for(int i = 0;i<t;i++)
    {
        for(int j =0;j<t;j++)
        {
            if(field[i][j] == 1 && isvisit[i][j] == false)
            {
                q.push({i,j});
                isvisit[i][j] = true;
                ans++;
                while(!q.empty())
                {
                    pair<int,int> cur = q.front(); q.pop();
                    for(int i = 0;i<4;i++)
                    {
                        int curx = cur.first + xdis[i];
                        int cury = cur.second + ydis[i];
                        if(curx<0||curx>=t||cury<0||cury>=t) continue;
                        if(isvisit[curx][cury]||field[curx][cury]==0) continue;
                        q.push({curx,cury});
                        isvisit[curx][cury] = true;
                        sum++;
                    }
                }
                d.push_back(sum);
                sum = 1;
             }
         }
    }
    cout << ans << '\n';
    sort(d.begin(),d.end());
    while(!d.empty())
    {
        cout << d.front() << '\n';
        d.pop_front();
    }
}

정답

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

#define X first
#define Y second
int dx[4] = { 1, 0, -1, 0 };
int dy[4] = { 0, 1, 0, -1 };
int n;
string board[27];
int vis[27][27];

int main(void){
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> n;
  for(int i = 0; i < n; i++) {
    cin >> board[i];
  }

  int count = 0;
  vector <int> ans;

  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (board[i][j] == '0' || vis[i][j] == 1)
        continue;
      queue < pair<int, int> > Q;
      vis[i][j] = 1;
      Q.push({ i, j });
      int width = 1;
      count++;
      while (!Q.empty()) {
        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 >= n)
            continue;
          if (board[nx][ny] == '0' || vis[nx][ny] == 1)
            continue;
          Q.push({ nx, ny });
          vis[nx][ny] = 1;
          width++;
        }
      }
      ans.push_back(width);
    }
  }

  cout << count << '\n';
  sort(ans.begin(), ans.end());

  for (int i : ans)
    cout << i << '\n';

  return 0; 
}
profile
개발자 지망생

0개의 댓글