์•Œ๊ณ ๋ฆฌ์ฆ˜๐Ÿฅš/๋ฌธ์ œํ’€์ด (Python)

[Baekjoon]18405. ๊ฒฝ์Ÿ์  ์ „์—ผ (Gold_5) 2024/4/9

๐Ÿช„ํ•˜๋ฃจ๐Ÿช„ 2024. 4. 9. 19:41
728x90
๋ฌธ์ œ ์ œ๋ชฉ ์ •๋‹ต๋ฅ  ๋‚œ์ด๋„
๊ฒฝ์Ÿ์  ์ „์—ผ 30% Gold_5

 

๋ฌธ์ œ์š”์•ฝ
์ •์‚ฌ๊ฐํ˜• ์‹œํ—˜๊ด€ ๊ธธ์ด N, ๋ฐ”์ด๋Ÿฌ์Šค ์ข…๋ฅ˜ K๊ฐ€ ์ฒซ ๋ฒˆ์งธ ์ค„์— ์ฃผ์–ด์ง„๋‹ค(๋ฐ”์ด๋Ÿฌ์Šค๋Š” 1~K๋ฒˆ๊นŒ์ง€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

1~N+1์ค„์—๋Š” ์‹œํ—˜๊ด€์— ์žˆ๋Š” ์ƒํƒœ(๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ์œผ๋ฉด ๋ฐ”์ด๋Ÿฌ์Šค ์ข…๋ฅ˜, ์—†์œผ๋ฉด 0)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

N+2 ์ค„์—๋Š” S, X, Y๊ฐ€ ์ฃผ์–ด์งˆ๋•Œ
์กฐ๊ฑด 1) 1 <=N <=200, 1 <=K <=1000, 0 <=S <=10000, 1 <=X, Y <=N 

์กฐ๊ฑด 2) ๋ฐ”์ด๋Ÿฌ์Šค๋Š” 1์ดˆ๋งˆ๋‹ค ์ƒ, ํ•˜, ์ขŒ, ์šฐ ๋นˆ ๊ณต๊ฐ„์— ์นจํˆฌํ•œ๋‹ค.(์ด๋ฏธ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ณณ์—๋Š” ์นจํˆฌํ•˜์ง€ ๋ชปํ•œ๋‹ค)

์กฐ๊ฑด 3) ๋ฐ”์ด๋Ÿฌ์Šค ์ข…๋ฅ˜์˜ ์ˆซ์ž๊ฐ€ ์ž‘์€ ์ˆœ์„œ๋Œ€๋กœ ์šฐ์„  ์นจํˆฌ๊ถŒ์„ ๊ฐ€์ง„๋‹ค


S์ดˆ ํ›„์— ์ •์‚ฌ๊ฐํ˜• ์‹œํ—˜๊ด€ X๋ฒˆ์งธ row Y๋ฒˆ์งธ col์˜ ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ๋ผ
 

ํ’€์ด

Step1. ๋ฐ”์ด๋Ÿฌ์Šค ๊ด€์ ์—์„œ ์ƒ๊ฐํ• ์ง€ ์‹œํ—˜๊ด€ ๊ด€์ ์—์„œ ์ƒ๊ฐํ• ์ง€ ํŒ๋‹จ

  • ๋ฐ”์ด๋Ÿฌ์Šค ๊ด€์ ์—์„œ ์ƒ๊ฐํ•  ๊ฒฝ์šฐ -> 1์ดˆ๋งˆ๋‹ค ์ƒํƒœ ์—…๋ฐ์ดํŠธ ํ•„์š”
  • ์‹œํ—˜๊ด€ ๊ด€์ ์—์„œ ์ƒ๊ฐํ•  ๊ฒฝ์šฐ -> ์ฃผ์œ„์˜ ๋ฐ”์ด๋Ÿฌ์Šค ์ฐพ์•„์•ผ ํ•จ


Step2. ์ง๊ด€์ ์œผ๋กœ ๋ฐ”์ด๋Ÿฌ์Šค ๊ด€์ ์—์„œ ์ƒ๊ฐํ•ด ๋ณด์ž

  • ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๊ณณ์˜ ์ •๋ณด๋ฅผ ๋ฐ›์•„์„œ
  • 1์ดˆ๋งˆ๋‹ค location update
  • ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์ž‘์€ ๊ฒŒ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋‹ˆ๊นŒ -> heapq ์ด์šฉํ•˜์ž
    • ๋” ์ž์„ธํžˆ ๊ธฐ์ˆ ํ•˜๋ฉด, ์‹œ๊ฐ„์ด ์ ์„์ˆ˜๋ก ์ธ๋ฑ์Šค๊ฐ€ ์ž‘์„์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๊ณ , ํ˜„์žฌ ์œ„์น˜์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ heapq์— [second, virus_idx, row, col]์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฝ์ž…ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.
  • ์ตœ๋Œ€ O(๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋Š” location ์ˆ˜*Second)์ด๋‹ˆ๊นŒ K*10000 (K <=40000) ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์œ„ํ•ด ๋” ๋นจ๋ฆฌ ๋๋‚ผ ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์ด ํ•„์š”)
    • XY์œ„์น˜์— ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์‚ฝ์ž…(์ด๋ฏธ ์‚ฝ์ž…๋œ ๊ณณ์—๋Š” ์นจํˆฌํ•˜์ง€ ๋ชปํ•˜๋‹ˆ๊นŒ) : location [X-1][Y-1]==0
    • ์ƒˆ๋กœ ์‚ฝ์ž…๋œ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ : virus_q

 

์ฝ”๋“œ

import sys
import heapq

f = sys.stdin.readline
N, K= map(int, f().split())

location=[]
virus_q=[]
for row in range(N):
    location.append(list(map(int, input().split())))
    for col in range(N):
        if location[row][col]!=0:
            heapq.heappush(virus_q, [0, location[row][col], row, col]) #second, virus_idx, row_idx, col_idx

f = sys.stdin.readline
S, X, Y= map(int, f().split())

while virus_q and virus_q[0][0] <= (S-1):
    if location[X-1][Y-1] != 0:
        break
    now = heapq.heappop(virus_q)
    four = [[now[2]-1, now[3]], [now[2]+1, now[3]],[now[2], now[3]-1], [now[2], now[3]+1]]
    for row_idx, col_idx in four:
        if row_idx >= 0 and row_idx < N and col_idx >= 0 and col_idx < N:
            if location[row_idx][col_idx] == 0:
                location[row_idx][col_idx] = now[1]
                heapq.heappush(virus_q, [now[0]+1, now[1], row_idx, col_idx])
print(location[X-1][Y-1])
728x90