PS

[๋ฐฑ์ค€] 16234 ์ธ๊ตฌ ์ด๋™ with Python

ํ˜•์ค€_It's 2022. 2. 3. 19:45
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ BOJ 16234 ์ธ๊ตฌ ์ด๋™

๐Ÿ’ก ์กฐ๊ฑด

  1. Nร—Nํฌ๊ธฐ์˜ ๋•…์ด ์žˆ๊ณ , ๋•…์€ 1ร—1๊ฐœ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค.
    N, L, R์ด ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค N โ‰ค 50, 1 โ‰ค L โ‰ค R โ‰ค 100)
  2. ์ธ๊ตฌ ์ด๋™์€ ํ•˜๋ฃจ ๋™์•ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง„ํ–‰๋˜๊ณ , ๋” ์ด์ƒ ์•„๋ž˜ ๋ฐฉ๋ฒ•์— ์˜ํ•ด ์ธ๊ตฌ ์ด๋™์ด ์—†์„ ๋•Œ๊นŒ์ง€ ์ง€์†๋œ๋‹ค.
      1. ๊ตญ๊ฒฝ์„ ์„ ๊ณต์œ ํ•˜๋Š” ๋‘ ๋‚˜๋ผ์˜ ์ธ๊ตฌ ์ฐจ์ด๊ฐ€ L๋ช… ์ด์ƒ, R๋ช… ์ดํ•˜๋ผ๋ฉด, ๋‘ ๋‚˜๋ผ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๊ตญ๊ฒฝ์„ ์„ ์˜ค๋Š˜ ํ•˜๋ฃจ ๋™์•ˆ ์—ฐ๋‹ค.
      1. ์œ„์˜ ์กฐ๊ฑด์— ์˜ํ•ด ์—ด์–ด์•ผํ•˜๋Š” ๊ตญ๊ฒฝ์„ ์ด ๋ชจ๋‘ ์—ด๋ ธ๋‹ค๋ฉด, ์ธ๊ตฌ ์ด๋™์„ ์‹œ์ž‘ํ•œ๋‹ค.
      1. ๊ตญ๊ฒฝ์„ ์ด ์—ด๋ ค์žˆ์–ด ์ธ์ ‘ํ•œ ์นธ๋งŒ์„ ์ด์šฉํ•ด ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด, ๊ทธ ๋‚˜๋ผ๋ฅผ ์˜ค๋Š˜ ํ•˜๋ฃจ ๋™์•ˆ์€ ์—ฐํ•ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค.
      1. ์—ฐํ•ฉ์„ ์ด๋ฃจ๊ณ  ์žˆ๋Š” ๊ฐ ์นธ์˜ ์ธ๊ตฌ์ˆ˜๋Š” (์—ฐํ•ฉ์˜ ์ธ๊ตฌ์ˆ˜) / (์—ฐํ•ฉ์„ ์ด๋ฃจ๊ณ  ์žˆ๋Š” ์นธ์˜ ๊ฐœ์ˆ˜)๊ฐ€ ๋œ๋‹ค.
      1. ์—ฐํ•ฉ์„ ํ•ด์ฒดํ•˜๊ณ , ๋ชจ๋“  ๊ตญ๊ฒฝ์„ ์„ ๋‹ซ๋Š”๋‹ค.
  3. ๊ฐ ๋‚˜๋ผ์˜ ์ธ๊ตฌ์ˆ˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ธ๊ตฌ ์ด๋™์ด ๋ฉฐ์น  ๋™์•ˆ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค.
  4. rํ–‰ c์—ด์— ์ฃผ์–ด์ง€๋Š” ์ •์ˆ˜๋Š” A[r][c]์˜ ๊ฐ’์ด๋‹ค. (0 โ‰ค A[r][c] โ‰ค 100)
  5. BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜, ๊ตฌํ˜„์œ ํ˜•์˜ ๋ฌธ์ œ

๐Ÿ–ฅ ์†Œ์Šค ์ฝ”๋“œ

from sys import stdin
from collections import deque

n, l, r = map(int, stdin.readline().split())
if l > r:
    l, r = r, l

board = []
for _ in range(n):
    board.append(list(map(int, stdin.readline().split())))

dx, dy = [1, 0, 0, -1], [0, -1, 1, 0]


def check(x, y):
    visited = set()
    q = deque()
    visited.add((x, y))
    q.append((x, y, board[x][y]))
    vals = [board[x][y]]
    tf = False

    while q:
        x, y, cost = q.popleft()

        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if -1 < nx < n and -1 < ny < n:
                if l <= abs(cost - board[nx][ny]) <= r and (nx, ny) not in visited:
                    visited.add((nx, ny))
                    q.append((nx, ny, board[nx][ny]))
                    vals.append(board[nx][ny])
                    tf = True

    if not tf:
        return False
    else:
        res = int(sum(vals) / len(vals))
        return [res, visited]


cnt = 0
while 1:
    tf = []
    for i in range(n):
        for j in range(n):
            temp = check(i, j)
            if temp is not False:
                tf.append(temp)

    if not tf:
        break
    else:
        cnt += 1
        for val, visited in tf:
            for x, y in visited:
                board[x][y] = val

print(cnt)

๐Ÿ”– ์˜ˆ์ œ ๋ฐ ์‹คํ–‰๊ฒฐ๊ณผ

์˜ˆ์ œ

2 20 50
50 30
30 40

์‹คํ–‰๊ฒฐ๊ณผ

1

โŒจ๏ธ ๋ฌธ์ œ ํ’€์ด

  1. board ๋ฆฌ์ŠคํŠธ์— ๊ฐ ๊ตญ๊ฐ€์˜ ์ธ๊ตฌ์ˆ˜๋ฅผ ์ž…๋ ฅ ๋ฐ›๊ณ , ์ธ๊ตฌ ์ด๋™ ํšŸ์ˆ˜๋ฅผ ์ €์žฅํ•  cnt ๋ณ€์ˆ˜๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”.
  2. ์ธ๊ตฌ ์ด๋™์ด ์ผ์–ด๋‚˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ while ๋ฐ˜๋ณต์„ ํ†ตํ•ด์„œ ์ฒดํฌ๋ฅผ ํ•ด์ค„ ๊ฒƒ.
  3. ์ธ๊ตฌ ์ด๋™์ด ์ผ์–ด๋‚ฌ์„ ๋•Œ, ์ธ๊ตฌ ์ด๋™ ํ›„์˜ ์ธ๊ตฌ ์ˆ˜์™€ ์ธ๊ตฌ ์ด๋™์ด ์ผ์–ด๋‚œ ๋„์‹œ์˜ ์ขŒํ‘œ๋ฅผ ๋‹ด์„ ๋ฆฌ์ŠคํŠธ ๋ณ€์ˆ˜ tf๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  4. board ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ, ๊ฐ ์ขŒํ‘œ์—์„œ ์—ฐํ•ฉ์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ตญ๊ฐ€๋ฅผ ์ฒดํฌํ•˜์—ฌ ๋ฐ˜ํ™˜๋œ ๊ฐ’์„ temp์— ์ €์žฅํ•œ๋‹ค.
    ๋งŒ์•ฝ, temp ๊ฐ€ False๋ผ๋ฉด ์ธ๊ตฌ์ด๋™์ด ์ผ์–ด๋‚˜์ง€ ์•Š์€ ๊ฒƒ์ด๋‹ค.
    ๋ฐ˜๋Œ€๋กœ False ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ธ๊ตฌ์ด๋™์ด ์ผ์–ด๋‚œ ๊ฒƒ์ด๋‹ค.
  5. board ์ „์ฒด๋ฅผ ์ˆœํšŒํ–ˆ์Œ์—๋„ ์ธ๊ตฌ์ด๋™์ด ์ผ์–ด๋‚˜์ง€ ์•Š์•„ tf๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด, ๊ทธ๋Œ€๋กœ while ๋ฌธ ๋ฐ–์œผ๋กœ ๋‚˜์˜จ๋‹ค.
  6. tf๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด, ์ธ๊ตฌ์ด๋™ ํšŸ์ˆ˜(cnt)๋ฅผ + 1 ํ•ด์ค€ ๋’ค,
    tf ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ, ์—ฐํ•ฉ๋ผ๋ฆฌ์˜ ์ธ๊ตฌ ์ด๋™์„ ํ•œ ์ขŒํ‘œ์— ํ•ด๋‹นํ•˜๋Š” ์ธ๊ตฌ ์ˆ˜๋กœ board ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.
  7. check() ํ•จ์ˆ˜์˜ ๋กœ์ง์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
    1. BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜์—ฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ์ขŒํ‘œ์™€ ์—ฐํ•ฉ์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ตญ๊ฐ€๋ฅผ ์ฐพ๋Š”๋‹ค.
    2. ๋‹ค์Œ ์ด๋™ํ•˜๋ ค๋Š” ์ขŒํ‘œ๊ฐ€ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์–ด์•ผํ•˜๊ณ ,
      ๊ทธ ์ขŒํ‘œ์— ํ•ด๋‹นํ•˜๋Š” board์˜ ๊ฐ’์ด l <= ๊ตญ๊ฒฝ์„ ๊ณต์œ ํ•˜๋Š” ๊ตญ๊ฐ€๋“ค์˜ ์ธ๊ตฌ ์ฐจ์ด <= r ์˜ ์กฐ๊ฑด์„ ์ง€์ผœ์•ผํ•œ๋‹ค.
    3. ๋˜ํ•œ (1), (2) ์˜ ์กฐ๊ฑด์„ ์ง€ํ‚จ ๊ฒฝ์šฐ, ์—ฐํ•ฉ๋“ค์˜ ๊ฐ ์ธ๊ตฌ์ˆ˜๋Š” vals ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•ด ํ‰๊ท  ์ธ๊ตฌ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
    4. check ํ•จ์ˆ˜ ๋‚ด์˜ ์ธ๊ตฌ์ด๋™ ํŒ๋ณ„ ๋ณ€์ˆ˜์ธ tf ์— ์ธ๊ตฌ์ด๋™์„ ํ–ˆ์„ ์‹œ, True ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

๐Ÿ’พ ๋А๋‚€์ 

  1. ๊ตญ๊ฒฝ์„ ์„ ๊ณต์œ ํ•˜๋Š” ๋‘ ๊ตญ๊ฐ€์˜ ์ธ๊ตฌ ์ฐจ์ด ์กฐ๊ฑด์„ ๋„ฃ๋Š” ๊ฒƒ์—์„œ ํ•œ๋ฒˆ ํ—ค๋งธ๋‹ค.
  2. ์—ฐํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๊ตญ๊ฐ€๋“ค์˜ ์ธ๊ตฌ ํ‰๊ท  ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—์„œ ๊ณ ๋ฏผ์„ ํ–ˆ์—ˆ๋‹ค.
  3. ๋ชจ๋“  ์—ฐํ•ฉ์„ ๋”ฐ๋กœ ๊ตฌํ•ด์„œ ์—ฐํ•ฉ๋ผ๋ฆฌ์˜ ํ‰๊ท  ์ธ๊ตฌ ์ˆ˜๋กœ ๊ฐฑ์‹ ํ•˜๋Š” ๋ถ€๋ถ„์ด ํ•œ๋ฒˆ์— ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค.
  4. ํ•˜์ง€๋งŒ (3)์˜ ๋ฐฉ์‹์ด ์•„๋‹Œ ์—ฐํ•ฉ์ด ์ƒ๊ธธ๋•Œ๋งˆ๋‹ค ๋ณ€๊ฒฝํ•ด์ฃผ์–ด ์˜ˆ์ œ ๊ฒฐ๊ณผ๋„ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ค๋Š” ๋Œ€์ฐธ์‚ฌ๊ฐ€ ์žˆ์—ˆ๋‹ค.
  5. BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘์—์„œ๋„ ์กฐ๊ฑด์ด ๊ฝค ์žˆ์–ด์„œ ๊ตฌํ˜„์ด ์กฐ๊ธˆ ๋ฌป์–ด๋‚˜์˜จ ๋ฌธ์ œ ๊ฐ™์•˜๊ณ , ํ’€๊ธฐ ์กฐ๊ธˆ ํž˜์ด ๋“ค์—ˆ๋‹ค.
๋ฐ˜์‘ํ˜•