[DFS] 인구 이동 - 백준 16234번

최대 1 분 소요

16234번: 인구 이동

Untitled

첫번째 풀이 (실패)

Untitled 1

Untitled 2

위 그림 처럼 구간을 나누려고 했음

그래서 기존의 2중 vector A와 2중 vector B를 만들어 구간을 1로 만드는 작업을 수행

Untitled 3

이렇게 말이다. 하지만 반례가 발생!!

반례

Untitled 4

서로 다른 구간이 겹쳐지는 문제 발생

두번째 풀이 (실수)

if(abs(A[x][y] - A[x+dx[i]][y+dy[i]]) >= L && abs(A[x][y] - A[x+dx[i]][y+dy[i]]) <= R) {
    sum += A[x][y];
    cnt++;
    lst.push_back(make_pair(x+dx[i], y+dy[i]));
    visited[x][y] = -1;
    func(x+dx[i], y+dy[i]);
}

A[x][y]이 조건에 충족한다면 sum에 추가하여 누적

하지만 마지막 칸이 sum에 누적되지 않는다!!

마지막 풀이 (성공)

void func(int x, int y) {
    visited[x][y] = 1;
    sum += A[x][y];
    cnt++;
    lst.push_back(make_pair(x, y));

함수 들어오자마자 그냥 push & sum 에도 추가

조건에 맞지 않는 셀도 들어가지 않냐??!!

if(cnt > 1) { // cnt 자기 빼고 2이상
    movement = true;
    int newPopulation = sum / cnt;
    for(int k=0; k<lst.size(); k++) {
        A[lst[k].first][lst[k].second] = newPopulation;
    }
}

그래서 cnt를 2이상으로 올린다.

자기 빼고 한개 더 ⇒ 인접한 셀이 있다!

코드

https://github.com/KimGyeongLock/CodingTest/blob/main/16234.cpp

카테고리:

업데이트: