ํŒŒ์ด์ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

[๋ฐฑ์ค€ 18405] ๊ฒฝ์Ÿ์  ์ „์—ผ (Python)

์€์ง„ 2022. 7. 12. 20:14

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป๋ฌธ์ œ์„ค๋ช…

[๋ฐฑ์ค€ 18405] ๊ฒฝ์Ÿ์  ์ „์—ผ (Python)
์ด์ฝ”ํ…Œ


๋ฌธ์ œ์š”์•ฝ

NxN ํฌ๊ธฐ์˜ ์‹œํ—˜๊ด€์ด ์žˆ๋‹ค. ๋ชจ๋“  ๋ฐ”์ด๋Ÿฌ์Šค๋Š” 1๋ฒˆ๋ถ€ํ„ฐ K๋ฒˆ๊นŒ์ง€ ์ค‘ ํ•˜๋‚˜๋‹ค.
๋ชจ๋“  ๋ฐ”์ด๋Ÿฌ์Šค๋Š” 1์ดˆ๋งˆ๋‹ค ์ƒ, ํ•˜, ์ขŒ, ์šฐ์˜ ๋ฐฉํ–ฅ์œผ๋กœ ์ฆ์‹ํ•œ๋‹ค.
๋‹จ, ๋งค ์ดˆ๋งˆ๋‹ค ๋ฒˆํ˜ธ๊ฐ€ ๋‚ฎ์€ ์ข…๋ฅ˜์˜ ๋ฐ”์ด๋Ÿฌ์Šค๋ถ€ํ„ฐ ๋จผ์ € ์ฆ์‹ํ•œ๋‹ค. ๋˜ํ•œ ๋นˆ์นธ์œผ๋กœ๋งŒ ์ฆ์‹ํ•  ์ˆ˜ ์žˆ๋‹ค.

S์ดˆ๊ฐ€ ์ง€๋‚œ ํ›„์— (X,Y)์— ์กด์žฌํ•˜๋Š” ๋ฐ”์ด๋Ÿฌ์Šค์˜ ์ข…๋ฅ˜๋ฅผ ์ถœ๋ ฅํ•˜์‹œ์˜ค.
๋‹จ, S์ดˆ ํ›„ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, 0์„ ์ถœ๋ ฅํ•œ๋‹ค.


์‹œํ—˜๊ด€ ๋ฐ”์ด๋Ÿฌ์Šค


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ž์—ฐ์ˆ˜ N, K๊ฐ€ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค N โ‰ค 200, 1 โ‰ค K โ‰ค 1,000)

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ ์‹œํ—˜๊ด€์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ–‰์€ N๊ฐœ์˜ ์›์†Œ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ํ•ด๋‹น ์œ„์น˜์— ์กด์žฌํ•˜๋Š” ๋ฐ”์ด๋Ÿฌ์Šค์˜ ๋ฒˆํ˜ธ๊ฐ€ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค. ๋‹จ, ํ•ด๋‹น ์œ„์น˜์— ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ 0์ด ์ฃผ์–ด์ง„๋‹ค.

๋˜ํ•œ ๋ชจ๋“  ๋ฐ”์ด๋Ÿฌ์Šค์˜ ๋ฒˆํ˜ธ๋Š” K์ดํ•˜์˜ ์ž์—ฐ์ˆ˜๋กœ๋งŒ ์ฃผ์–ด์ง„๋‹ค. N+2๋ฒˆ์งธ ์ค„์—๋Š” S, X, Y๊ฐ€ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค. (0 โ‰ค S โ‰ค 10,000, 1 โ‰ค X, Y โ‰ค N)


์ถœ๋ ฅ

S์ดˆ ๋’ค์— (X,Y)์— ์กด์žฌํ•˜๋Š” ๋ฐ”์ด๋Ÿฌ์Šค์˜ ์ข…๋ฅ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ S์ดˆ ๋’ค์— ํ•ด๋‹น ์œ„์น˜์— ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, 0์„ ์ถœ๋ ฅํ•œ๋‹ค.


์˜ˆ์ œ ์ž…๋ ฅ 1
3 3
1 0 2
0 0 0
3 0 0
2 3 2

์˜ˆ์ œ ์ถœ๋ ฅ 1
3


์˜ˆ์ œ ์ž…๋ ฅ 2
3 3
1 0 2
0 0 0
3 0 0
1 2 2

์˜ˆ์ œ ์ถœ๋ ฅ 2
0


โœ๏ธIdea Sketch

์•Œ๊ณ ๋ฆฌ์ฆ˜ : BFS

๋ฐ”์ด๋Ÿฌ์Šค๋Š” 1์ดˆ๋งˆ๋‹ค ์ƒ, ํ•˜, ์ขŒ, ์šฐ์˜ ๋ฐฉํ–ฅ์œผ๋กœ ํ•œ ๋‹จ๊ณ„์”ฉ ์ฆ์‹ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.


์‹œ๊ฐ„๋ณต์žก๋„

๊ทธ๋ž˜ํ”„ ํฌ๊ธฐ O(NM)

2์ฐจ์› ๋งต์—์„œ ์ƒํ•˜์ขŒ์šฐ 4๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ผ ์ˆ˜ ์žˆ์„ ๋•Œ, BFS ํƒ์ƒ‰ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๊ทธ๋ž˜ํ”„ ํฌ๊ธฐ O(NM)์ด๋‹ค.

์ด ๋ฌธ์ œ์—์„œ๋„ ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ๋นˆ์นธ์œผ๋กœ๋งŒ ์ฆ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ƒํ•˜์ขŒ์šฐ ํƒ์ƒ‰์„ ๋๋‚ธ ์‹œํ—˜๊ด€์€ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(NM)์ด๋‹ค.


โœ๏ธ๋‚ด ์†Œ์Šค์ฝ”๋“œ

  • ๋งค ์ดˆ๋งˆ๋‹ค ๋ฒˆํ˜ธ๊ฐ€ ๋‚ฎ์€ ์ข…๋ฅ˜์˜ ๋ฐ”์ด๋Ÿฌ์Šค๋ถ€ํ„ฐ ๋จผ์ € ์ฆ์‹ํ•˜๋ฏ€๋กœ heap์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.
  • ์ƒˆ๋กญ๊ฒŒ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์ฆ์‹ํ•œ ์‹œํ—˜๊ด€์€ "1์ดˆ๊ฐ€ ์ง€๋‚œ ๋’ค์—" ๋ฐฉ๋ฌธํ•ด์•ผํ•œ๋‹ค. ์ฆ‰ ํƒ์ƒ‰ ์ค‘์ธ queue๊ฐ€ ์•„๋‹ˆ๋ผ new queue์— ์ •๋ณด๋ฅผ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค.
  • 1์ดˆ๊ฐ€ ์ง€๋‚˜๋ฉด ์ƒˆ๋กญ๊ฒŒ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์ฆ์‹ํ•œ ์‹œํ—˜๊ด€์„ ๋ฐฉ๋ฌธํ•œ๋‹ค. ๋”ฐ๋ผ์„œ queue๋Š” new queue๊ฐ€ ๋˜๊ณ , new queue๋Š” ๋นˆ ๋ฐฐ์—ด๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  • S์ดˆ๊ฐ€ ์ง€๋‚œ ๋’ค ์ตœ์ข… target ์ง€์  ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์‹œํ—˜๊ด€ ๋ฐ”์ด๋Ÿฌ์Šค

  import sys
  from copy import deepcopy
  from heapq import heappop, heappush

  si = sys.stdin.readline
  n, k = map(int, si().split())
  graph = [list(map(int, si().split())) for _ in range(n)]
  s, tx, ty = map(int, si().split())

  q, nq = [], []

  for i in range(n):
      for j in range(n):
          if graph[i][j]:
              heappush(q, (graph[i][j], i, j))

  for _ in range(s):
      while q:
          v, x, y = heappop(q)

          # ๋นˆ ์ž๋ฆฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ -> graph ๋ฐ new queue์— ์ถ”๊ฐ€
          for dx, dy in (1, 0), (0, 1), (-1, 0), (0, -1):
              nx, ny = x + dx, y + dy

              if (0 <= nx < n) and (0 <= ny < n) and graph[nx][ny] == 0:
                  graph[nx][ny] = v
                  heappush(nq, (v, nx, ny))

      q = deepcopy(nq)
      nq = []

  print(graph[tx-1][ty-1])