본문 바로가기

알고리즘/삼성 기출

인구 이동 [백준 16234번]

문제

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

 

16234번: 인구 이동

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

www.acmicpc.net

 

내 풀이

 

BFS를 사용해서 국경선을 공유하는 그룹을 찾고, 국경선을 공유하는 그룹에는 몇 개의 나라가 있는지 리턴하는 함수를 만들었다.

 

인구 이동이 며칠 동안 이루어지는지 구해야 하므로 while 반복문을 사용했고, 여기서 while문을 중단시키기 위한 조건이 중요하다.

국경선을 공유하는 그룹이 1개 이상인 경우 flag를 True로 만들었다.

flag가 계속 False라면 인구이동이 이루어지지 않았다는 뜻이므로, 그때 while문을 중단시켰다.

 

import sys
from collections import deque

input = sys.stdin.readline
N, L, R = map(int, input().strip().split())
A = [list(map(int, input().strip().split()))for x in range(N)]
dx, dy = [-1, 1, 0, 0], [0, 0, 1, -1]
check = None

def bfs(i, j):
    num, cnt = A[i][j], 1
    mem = [(i, j)]
    q = deque()
    check[i][j] = True
    q.append((i, j))
    while q:
        x, y = q.popleft()
        for i in range(4):
            nx, ny = x+dx[i], y+dy[i]
            if 0<=nx<N and 0<=ny<N:
                if not check[nx][ny] and L <= abs(A[x][y]-A[nx][ny]) <= R:
                    num, cnt = num+A[nx][ny], cnt+1
                    mem.append((nx, ny))
                    check[nx][ny] = True
                    q.append((nx, ny))
    for x, y in mem:
        A[x][y] = int(num//cnt)
    return len(mem)

ans = 0
while True:
    flag = False
    check = [[False]*N for _ in range(N)]
    for i in range(N):
        for j in range(N):
            if not check[i][j]:
                if bfs(i, j) > 1:
                    flag = True
    if not flag: break
    ans += 1
print(ans)

 

총평

빡구현!!!

'알고리즘 > 삼성 기출' 카테고리의 다른 글

드래곤 커브 [백준 15685번]  (0) 2022.10.06
감시 [백준 15683번]  (0) 2022.10.05
치킨 배달 [백준 15686번]  (0) 2022.09.29
퇴사 [백준 14501번]  (0) 2022.09.22
테트로미노 [백준 14500번]  (0) 2022.09.19