뒤늦게 백엔드파는 블로그

닫기 검색결과 전체 보기

    백준(BOJ) 16234 : 인구 이동

    BOJ 2020. 6. 22. 23:54

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

     

    16234번: 인구 이동

    N×N크기의 땅이 있고, 땅은 1×1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 모��

    www.acmicpc.net

     

    요놈도 문제가 길다.

    마찬가지로 BFS + 구현 문제이다.

    BFS를 통해서 갈 수 있는 나라끼리는 연합이 될 수 있으므로 방문이 안된 국가들에 대해 bfs를 돌려 서로 방문할 수 있는 국가들끼리 인구수를 더해 똑같이 분배해주도록하자.

    더이상 국경선이 열릴 수 없을 때에 답을 출력해주면 되겠다.

    아래는 소스코드이다.

    더보기
    #include <bits/stdc++.h>
    #define endl '\n'
    #define pb push_back
    #define mp make_pair
    #define MOD 1000000007
    #define cont continue
    #define rep(i, n) for(int i = 0 ; i < (n) ; i++)
    #define all(x) (x).begin(), (x).end()
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pii;
    typedef pair<ll,ll> pll;
    const ll INF = 987654321;
    
    int arr[51][51] = {};
    bool visit[51][51] = {};
    bool flag = false;
    int dy[4] = {-1, 1, 0, 0};
    int dx[4] = {0, 0, -1, 1};
    ll N, L, R;
    
    bool isRange(int y, int x) {
      if(y <= 0 || y > N || x <= 0 || x > N) {
        return false;
      }
      return true;
    }
    
    void bfs(int y, int x) {
      vector<pii> visited;
      queue<pii> q;
      ll sum = 0;
      q.push(mp(y, x));
      visited.pb(mp(y, x));
      sum += arr[y][x];
      visit[y][x] = true;
      while(!q.empty()) {
        int cury = q.front().first;
        int curx = q.front().second;
        q.pop();
        for(int i = 0 ; i < 4 ; i++) {
          int ny = cury + dy[i];
          int nx = curx + dx[i];
          if(!isRange(ny, nx)) continue;
          ll diff = abs(arr[cury][curx] - arr[ny][nx]);
          if(!visit[ny][nx] && diff >= L && diff <= R) {
            flag = true;
            q.push(mp(ny, nx));
            visit[ny][nx] = true;
            visited.pb(mp(ny, nx));
            sum += arr[ny][nx];
          }
        }
      }
      ll tmp = visited.size();
      ll res = sum / tmp;
    
      for(int i = 0 ; i < visited.size() ; i++) {
        arr[visited[i].first][visited[i].second] = res;
      }
      return;
    }
    
    
    int main() {
      cin.tie(NULL);
      ios_base::sync_with_stdio(false);
    
      cin >> N >> L >> R;
    
      for(int i = 1 ; i <= N ; i++) {
        for(int j = 1;  j <= N ; j++) {
          cin >> arr[i][j];
        }
      }
      ll ans = 0;
    
      while(1) {
        flag = false;
        memset(visit, false, sizeof(visit));
        for(int i = 1 ; i <= N ; i++) {
          for(int j = 1 ; j <= N ; j++) {
            if(!visit[i][j]) {
              bfs(i, j);
            }
          }
        }
        if(!flag) break;
        else ans++;
      }
      cout << ans << endl;
    } 
    
    저작자표시 (새창열림)

    'BOJ' 카테고리의 다른 글

    백준(BOJ) 19235 : 모노모노도미노  (0) 2020.06.27
    백준(BOJ) 11867 : 박스 나누기 게임  (0) 2020.06.26
    백준(BOJ) 19238 : 스타트 택시  (0) 2020.06.22
    백준(BOJ) 9660 : 돌 게임 6  (0) 2020.06.18
    백준(BOJ) 1005 : ACM Craft  (0) 2020.06.16
    'BOJ' 관련 글 more
    • thumbnail
      백준(BOJ) 19235 : 모노모노도미노 2020.06.27
    • thumbnail
      백준(BOJ) 11867 : 박스 나누기 게임 2020.06.26
    • thumbnail
      백준(BOJ) 19238 : 스타트 택시 2020.06.22
    • thumbnail
      백준(BOJ) 9660 : 돌 게임 6 2020.06.18
    Posted by 엄태호
블로그 이미지

by 엄태호

공지사항

    최근...

  • 포스트
  • 댓글
  • 더 보기

태그

글 보관함

«   2025/07   »
일 월 화 수 목 금 토
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

링크

카테고리

분류 전체보기 (15)
BOJ (12)
Codeforces (3)
Div. 2 (2)
Div. 3 (1)
Div. 4 (0)
Web (0)
Spring (0)

카운터

Total
Today
Yesterday
  • 홈
  • 태그
  • 방명록
  • 소개
엄태호's Blog is powered by daumkakao
Skin info material T Mark 5+ by 뭐하라
favicon

뒤늦게 백엔드파는 블로그

  • 홈
  • 태그
  • 방명록
  • 소개

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • 분류 전체보기 (15)
    • BOJ (12)
    • Codeforces (3)
      • Div. 2 (2)
      • Div. 3 (1)
      • Div. 4 (0)
    • Web (0)
      • Spring (0)

카테고리

PC화면 보기 티스토리 Daum

티스토리툴바