[BOJ][๐ŸŸก5][๋ฐฑ์ค€#16234] ์ธ๊ตฌ ์ด๋™

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #16234


๋ฌธ์ œ

Nร—Nํฌ๊ธฐ์˜ ๋•…์ด ์žˆ๊ณ , ๋•…์€ 1ร—1๊ฐœ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ๋•…์—๋Š” ๋‚˜๋ผ๊ฐ€ ํ•˜๋‚˜์”ฉ ์กด์žฌํ•˜๋ฉฐ, rํ–‰ c์—ด์— ์žˆ๋Š” ๋‚˜๋ผ์—๋Š” A[r][c]๋ช…์ด ์‚ด๊ณ  ์žˆ๋‹ค. ์ธ์ ‘ํ•œ ๋‚˜๋ผ ์‚ฌ์ด์—๋Š” ๊ตญ๊ฒฝ์„ ์ด ์กด์žฌํ•œ๋‹ค. ๋ชจ๋“  ๋‚˜๋ผ๋Š” 1ร—1 ํฌ๊ธฐ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ๊ตญ๊ฒฝ์„ ์€ ์ •์‚ฌ๊ฐํ˜• ํ˜•ํƒœ์ด๋‹ค. ์˜ค๋Š˜๋ถ€ํ„ฐ ์ธ๊ตฌ ์ด๋™์ด ์‹œ์ž‘๋˜๋Š” ๋‚ ์ด๋‹ค. ์ธ๊ตฌ ์ด๋™์€ ํ•˜๋ฃจ ๋™์•ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง„ํ–‰๋˜๊ณ , ๋” ์ด์ƒ ์•„๋ž˜ ๋ฐฉ๋ฒ•์— ์˜ํ•ด ์ธ๊ตฌ ์ด๋™์ด ์—†์„ ๋•Œ๊นŒ์ง€ ์ง€์†๋œ๋‹ค.

๊ตญ๊ฒฝ์„ ์„ ๊ณต์œ ํ•˜๋Š” ๋‘ ๋‚˜๋ผ์˜ ์ธ๊ตฌ ์ฐจ์ด๊ฐ€ L๋ช… ์ด์ƒ, R๋ช… ์ดํ•˜๋ผ๋ฉด,ย ๋‘ ๋‚˜๋ผ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๊ตญ๊ฒฝ์„ ์„ ์˜ค๋Š˜ ํ•˜๋ฃจ ๋™์•ˆ ์—ฐ๋‹ค. ์œ„์˜ ์กฐ๊ฑด์—ย ์˜ํ•ด ์—ด์–ด์•ผํ•˜๋Š” ๊ตญ๊ฒฝ์„ ์ด ๋ชจ๋‘ ์—ด๋ ธ๋‹ค๋ฉด, ์ธ๊ตฌ ์ด๋™์„ ์‹œ์ž‘ํ•œ๋‹ค. ๊ตญ๊ฒฝ์„ ์ด ์—ด๋ ค์žˆ์–ด ์ธ์ ‘ํ•œ ์นธ๋งŒ์„ ์ด์šฉํ•ด ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด, ๊ทธ ๋‚˜๋ผ๋ฅผ ์˜ค๋Š˜ ํ•˜๋ฃจ ๋™์•ˆ์€ ์—ฐํ•ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์—ฐํ•ฉ์„ ์ด๋ฃจ๊ณ  ์žˆ๋Š” ๊ฐ ์นธ์˜ ์ธ๊ตฌ์ˆ˜๋Š” (์—ฐํ•ฉ์˜ ์ธ๊ตฌ์ˆ˜) / (์—ฐํ•ฉ์„ ์ด๋ฃจ๊ณ  ์žˆ๋Š” ์นธ์˜ ๊ฐœ์ˆ˜)๊ฐ€ ๋œ๋‹ค. ํŽธ์˜์ƒย ์†Œ์ˆ˜์ ์€ ๋ฒ„๋ฆฐ๋‹ค. ์—ฐํ•ฉ์„ ํ•ด์ฒดํ•˜๊ณ , ๋ชจ๋“  ๊ตญ๊ฒฝ์„ ์„ ๋‹ซ๋Š”๋‹ค.

๊ฐ ๋‚˜๋ผ์˜ ์ธ๊ตฌ์ˆ˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ธ๊ตฌ ์ด๋™์ด ๋ฉฐ์น  ๋™์•ˆ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N, L, R์ด ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค N โ‰ค 50, 1 โ‰ค L โ‰ค R โ‰ค 100) ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฐ ๋‚˜๋ผ์˜ ์ธ๊ตฌ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. rํ–‰ c์—ด์— ์ฃผ์–ด์ง€๋Š” ์ •์ˆ˜๋Š” A[r][c]์˜ ๊ฐ’์ด๋‹ค. (0 โ‰ค A[r][c] โ‰ค 100) ์ธ๊ตฌ ์ด๋™์ด ๋ฐœ์ƒํ•˜๋Š” ์ผ์ˆ˜๊ฐ€ 2,000๋ฒˆ ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž…๋ ฅ๋งŒ ์ฃผ์–ด์ง„๋‹ค.


์ถœ๋ ฅ

์ธ๊ตฌ ์ด๋™์ด ๋ฉฐ์น  ๋™์•ˆย ๋ฐœ์ƒํ•˜๋Š”์ง€ ์ฒซ์งธ ์ค„์— ์ถœ๋ ฅํ•œ๋‹ค.


์˜ˆ์ œ

์˜ˆ์ œ 1

์ž…๋ ฅ

2 20 50
50 30
20 40


์ถœ๋ ฅ

1


์˜ˆ์ œ 2

์ž…๋ ฅ

2 40 50
50 30
20 40


์ถœ๋ ฅ

0


์˜ˆ์ œ 3

์ž…๋ ฅ

2 20 50
50 30
30 40


์ถœ๋ ฅ

1


์˜ˆ์ œ 4

์ž…๋ ฅ

3 5 10
10 15 20
20 30 25
40 22 10


์ถœ๋ ฅ

2


์˜ˆ์ œ 5

์ž…๋ ฅ

4 10 50
10 100 20 90
80 100 60 70
70 20 30 40
50 20 100 10


์ถœ๋ ฅ

3


My Sol

def findUnion(i, j):
    global visited, N, L, R, POP
    visited[i][j] = 1
    unionQ = [(i, j)]
    start = -1
    end = 1

    while start < end-1:
        start += 1
        ni, nj = unionQ[start]

        # ์ƒํ•˜์ขŒ์šฐ ํƒ์ƒ‰
        didj = [(-1,0),(0,-1),(1,0),(0,1)]
        for di, dj in didj:
            # ํƒ์ƒ‰ ์ขŒํ‘œ๊ฐ€ ๋ฒ”์œ„ ๋‚ด์— ์žˆ๊ณ ,
            if 0<=ni+di<N and 0<=nj+dj<N:
                # ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋˜ ๊ณณ์ด๋ฉฐ,
                if not visited[ni+di][nj+dj]:
                    # ํ˜„์žฌ ์œ„์น˜์˜ ์ธ๊ตฌ์ˆ˜ ์ฐจ์ด๊ฐ€ L ์ด์ƒ R ์ดํ•˜๋ผ๋ฉด
                    if L <= abs(POP[ni][nj] - POP[ni+di][nj+dj]) <= R:
                        # visited์— ๋ฐ˜์˜ํ•˜๊ณ  unionQ์— ์ถ”๊ฐ€
                        visited[ni+di][nj+dj] = 1
                        unionQ.append((ni+di, nj+dj))
                        end += 1
    return unionQ



N, L, R = map(int, input().split())
POP = [list(map(int, input().split())) for _ in range(N)]
ret = 0

while True:
    visited = [[0]*N for _ in range(N)]
    unions = []
    for i in range(N):
        for j in range(N):
            if not visited[i][j]:
                union = findUnion(i, j)
                # union์ด 2 ๊ตญ๊ฐ€ ์ด์ƒ์ผ ๋•Œ๋งŒ unions์— union ์ถ”๊ฐ€
                if len(union) > 1:
                    unions.append(union)

    # ์ข…๋ฃŒ์กฐ๊ฑด : unions๊ฐ€ ์—†์œผ๋ฉด ์ธ๊ตฌ ์ด๋™ ์—†์Œ
    if not unions:
        break

    # POP2 ์ƒ์„ฑ
    POP2 = []
    for lst in POP:
        POP2.append(lst[::])

    # ์—ฐํ•ฉ ๋ณ„ POP2์— ์ธ๊ตฌ ์žฌ๋ถ„๋ฐฐ
    for union in unions:
        # ์—ฐํ•ฉ ๋‚ด ๋‚˜๋ผ ์ˆ˜, ์ธ๊ตฌ ํ•ฉ๊ณ„ ๊ณ„์‚ฐ
        sum_pop = 0
        cnt = 0
        for country in union:
            ci, cj = country
            sum_pop += POP[ci][cj]
            cnt += 1

        # ์—ฐํ•ฉ ๋‚ด ์ธ๊ตฌ ์žฌ๋ถ„๋ฐฐ
        avg_pop = sum_pop // cnt
        for country in union:
            ci, cj = country
            POP2[ci][cj] = avg_pop

    # POP2๋ฅผ POP์œผ๋กœ ๊ฐฑ์‹ (์–•์€ ๋ณต์‚ฌ ๊ฐ€๋Šฅ)
    POP = POP2

    # ๊ฒฐ๊ณผ + 1
    ret += 1

print(ret)

์ƒ๊ฐํ–ˆ๋˜๋Œ€๋กœ ํ’€ ์ˆ˜ ์žˆ๋˜ ๋ฌธ์ œ์˜€๊ณ , ์–ด๋ ค์šด ๋ฌธ์ œ๋“ค์„ ํ’€๊ณ ์™€์„œ ๊ทธ๋Ÿฐ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต๊ฒŒ ๋Š๊ปด์ง€์ง€๋Š” ์•Š์•˜๋˜ ๋ฌธ์ œ์˜€๋‹ค.


๋ฌธ์ œ ํ’€์ด ์ „๊ฐœ ๋ฐฉ์‹

  1. ์ž…๋ ฅ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌ
  2. visited 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ชจ๋“  ์ขŒํ‘œ์— ๋Œ€ํ•ด ์™„์ „ ํƒ์ƒ‰
  3. visited๊ฐ€ 0์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ์ขŒํ‘œ๋ถ€ํ„ฐ ์ƒํ•˜์ขŒ์šฐ ํ™•์ธํ•˜์—ฌ ์—ฐํ•ฉ ๊ฐ€๋Šฅ ๊ตญ๊ฐ€ ์ฒดํฌ
  4. ๋ฒ”์œ„ ๋‚ด์ด๊ณ , ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ, ์—ฐํ•ฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, ์—ฐํ•ฉ์— ์ถ”๊ฐ€(visited๋„ ์ฒดํฌ)
  5. BFS : ์—ฐํ•ฉ์— ์ถ”๊ฐ€๋œ ๊ตญ๊ฐ€ ์ขŒํ‘œ ๊ธฐ์ค€์œผ๋กœ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ์กฐํšŒํ•˜๋ฉฐ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์—ฐํ•ฉ์— ๋Œ€ํ•œ Queue ์ฑ„์šฐ๊ธฐ
  6. ํ•จ์ˆ˜ ์™ธ๋ถ€์— Union Queue๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ์ด๋ฅผ union ๋‚ด๋ถ€ ๊ตญ๊ฐ€๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๋ผ๋ฉด unions ๋ฐฐ์—ด์— ์ถ”๊ฐ€
  7. 2~6๋ฒˆ์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ visited ๋ชจ๋‘ ์กฐํšŒ
  8. unions์˜ ๊ฐ union์˜ ๊ตญ๊ฐ€ ์ขŒํ‘œ๋กœ ํ‰๊ท  ์ธ๊ตฌ ์ˆ˜ ๊ณ„์‚ฐํ•˜์—ฌ ๋ณ„๋„์˜ 2์ฐจ์› ๋ฐฐ์—ด์— ๋„ฃ๊ธฐ
  9. ์ธ๊ตฌ ์ด๋™ ํšŸ์ˆ˜ 1 ์ฆ๊ฐ€
  10. 1~9 ๋ฐ˜๋ณต : ์ข…๋ฃŒ ์กฐ๊ฑด์€ ์–ด๋– ํ•œ ๊ตญ๊ฐ€์™€๋„ ์„œ๋กœ ์ธ๊ตฌ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์•„ unions๊ฐ€ ๋นˆ(False) ๊ฒฝ์šฐ


BFS๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ€๋Šฅํ•œ ์—ฐํ•ฉ์„ ์กฐํšŒํ•˜๋Š” ํ•จ์ˆ˜ findUnion() ํ•จ์ˆ˜๋ฅผ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•˜์—ฌ visited ์กฐํšŒ์™€ Union ํƒ์ƒ‰์ด ๊ฐ€์‹œ์ ์œผ๋กœ ๋ถ„๋ฆฌ๋˜๋„๋ก ์ž‘์„ฑํ•˜์˜€๋‹ค. ์ฝ”๋“œ๋ณ„ ์ž์„ธํ•œ ์„ค๋ช…์€ ์ฃผ์„ ์ฐธ๊ณ .


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ