😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[BAEKJOON python] 19238_μŠ€νƒ€νŠΈ νƒμ‹œ λ³Έλ¬Έ

πŸ¦₯ μ½”ν…Œ/BAEKJOON

[BAEKJOON python] 19238_μŠ€νƒ€νŠΈ νƒμ‹œ

μ§•μ§•μ•ŒνŒŒμΉ΄ 2023. 4. 8. 17:58
728x90
λ°˜μ‘ν˜•
μŠ€νƒ€νŠΈ νƒμ‹œ
μŠ€νƒ€νŠΈ νƒμ‹œλŠ” μ†λ‹˜μ„ λ„μ°©μ§€λ‘œ λ°λ €λ‹€μ€„ λ•Œλ§ˆλ‹€ μ—°λ£Œκ°€ μΆ©μ „λ˜κ³ , μ—°λ£Œκ°€ λ°”λ‹₯λ‚˜λ©΄ κ·Έ λ‚ μ˜ μ—…무가 λλ‚¨

νƒμ‹œ κΈ°μ‚¬λŠ” μ˜€λŠ˜ Mλͺ…μ˜ μŠΉκ°μ„ νƒœμš°λŠ” κ²ƒμ΄ λͺ©ν‘œ
ν™œλ™ μ˜μ—­μ€ N×N ν¬κΈ°μ˜ κ²©μž, κ° μΉΈμ€ λΉ„μ–΄ μžˆκ±°λ‚˜ λ²½μ΄ λ†“μ—¬ μžˆμŒ
νƒμ‹œκ°€ λΉˆμΉΈμ— μžˆμ„ λ•Œ, μƒν•˜μ’Œμš°λ‘œ μΈμ ‘ν•œ λΉˆμΉΈ μ€‘ ν•˜λ‚˜λ‘œ μ΄λ™
    νŠΉμ • μœ„μΉ˜λ‘œ μ΄λ™ν•  λ•Œ ν•­μƒ μ΅œλ‹¨κ²½λ‘œλ‘œλ§Œ μ΄λ™

Mλͺ…μ˜ μŠΉκ°μ€ λΉˆμΉΈ μ€‘ ν•˜λ‚˜μ— μ„œ μžˆμœΌλ©°, λ‹€λ₯Έ λΉˆμΉΈ μ€‘ ν•˜λ‚˜λ‘œ μ΄λ™
μ—¬λŸ¬ μŠΉκ°μ΄ κ°™μ΄ νƒ‘μŠΉν•˜λŠ” κ²½μš°λŠ” μ—†μŒ
νƒμ‹œ κΈ°μ‚¬λŠ” ν•œ μŠΉκ°μ„ νƒœμ›Œ λͺ©μ μ§€λ‘œ μ΄λ™μ‹œν‚€λŠ” μΌμ„ M번 λ°˜λ³΅
각 μŠΉκ°μ€ μŠ€μŠ€λ‘œ μ›€μ§μ΄μ§€ μ•ŠμœΌλ©°, μΆœλ°œμ§€μ—μ„œλ§Œ νƒμ‹œμ— νƒˆ μˆ˜ μžˆκ³ , λͺ©μ μ§€μ—μ„œλ§Œ νƒμ‹œμ—μ„œ λ‚΄λ¦΄ μˆ˜ μžˆμŒ

νƒμ‹œκΈ°μ‚¬κ°€ νƒœμšΈ μŠΉκ°μ„ κ³ λ₯Ό λ•ŒλŠ” ν˜„μž¬ μœ„μΉ˜μ—μ„œ μ΅œλ‹¨κ±°λ¦¬κ°€ κ°€μž₯ μ§§μ€ μŠΉκ°μ„ κ³ λ¦„
   μŠΉκ°μ΄ μ—¬λŸ¬ λͺ…이면 κ·Έμ€‘ ν–‰ λ²ˆν˜Έκ°€ κ°€μž₯ μž‘은 μŠΉκ°
       κ·ΈλŸ° μŠΉκ°λ„ μ—¬λŸ¬ λͺ…이면 κ·Έμ€‘ μ—΄ λ²ˆν˜Έκ°€ κ°€μž₯ μž‘은 μŠΉκ°
νƒμ‹œμ™€ μŠΉκ°μ΄ κ°™μ€ μœ„μΉ˜μ— μ„œ μžˆμœΌλ©΄ κ·Έ μŠΉκ°κΉŒμ§€μ˜ μ΅œλ‹¨κ±°λ¦¬λŠ” 0

1) μ—°λ£ŒλŠ” ν•œ μΉΈ μ΄λ™ν•  λ•Œλ§ˆλ‹€ 1만큼 μ†Œλͺ¨
2) ν•œ μŠΉκ°μ„ λͺ©μ μ§€λ‘œ μ„±κ³΅μ μœΌλ‘œ μ΄λ™μ‹œν‚€λ©΄, κ·Έ μŠΉκ°μ„ νƒœμ›Œ μ΄λ™ν•˜λ©΄μ„œ μ†Œλͺ¨ν•œ μ—°λ£Œ μ–‘μ˜ λ‘ λ°°κ°€ μΆ©μ „
3) μ΄λ™ν•˜λŠ” λ„쀑에 μ—°λ£Œκ°€ λ°”λ‹₯λ‚˜λ©΄ μ΄λ™μ— μ‹€νŒ¨ν•˜κ³ , κ·Έ λ‚ μ˜ μ—…무가 λλ‚¨
    μŠΉκ°μ„ λͺ©μ μ§€λ‘œ μ΄λ™μ‹œν‚¨ λ™μ‹œμ— μ—°λ£Œκ°€ λ°”λ‹₯λ‚˜λŠ” κ²½μš°λŠ” μ‹€νŒ¨ν•œ κ²ƒμœΌλ‘œ κ°„μ£Όν•˜μ§€ μ•ŠμŒ

νƒμ‹œμ™€ μ„Έ λͺ…μ˜ μŠΉκ°μ˜ μΆœλ°œμ§€μ™€ λͺ©μ μ§€κ°€ ν‘œμ‹œ
λͺ¨λ“  μŠΉκ°μ„ μ„±κ³΅μ μœΌλ‘œ λ°λ €λ‹€μ€„ μˆ˜ μžˆλŠ”지 μ•Œμ•„λ‚΄κ³ , λ°λ €λ‹€μ€„ μˆ˜ μžˆμ„ κ²½μš° μ΅œμ’…μ μœΌλ‘œ λ‚¨λŠ” μ—°λ£Œμ˜ μ–‘을 μΆœλ ₯
    μ΄λ™ λ„쀑에 μ—°λ£Œκ°€ λ°”λ‹₯λ‚˜μ„œ λ‹€μŒ μΆœλ°œμ§€λ‚˜ λͺ©μ μ§€λ‘œ μ΄λ™ν•  μˆ˜ μ—†μœΌλ©΄ -1을 μΆœλ ₯
    λͺ¨λ“  μ†λ‹˜μ„ μ΄λ™μ‹œν‚¬ μˆ˜ μ—†λŠ” κ²½μš°μ—λ„ -1을 μΆœλ ₯

첫 μ€„에 N, M, κ·Έλ¦¬κ³  μ΄ˆκΈ° μ—°λ£Œμ˜ μ–‘
    (2 ≤ N ≤ 20, 1 ≤ M ≤ N2, 1 ≤ μ΄ˆκΈ° μ—°λ£Œ ≤ 500,000) μ—°λ£ŒλŠ” λ¬΄ν•œνžˆ λ§Žμ΄ λ‹΄μ„ μˆ˜ μžˆκΈ° λ•Œλ¬Έμ—, μ΄ˆκΈ° μ—°λ£Œμ˜ μ–‘을 λ„˜μ–΄μ„œ μΆ©μ „
λ‹€μŒ μ€„λΆ€ν„° N개의 μ€„에 κ±Έμ³ λ°±μ€€μ΄ ν™œλ™ν•  μ˜μ—­μ˜ μ§€λ„
   0은 λΉˆμΉΈ, 1은 λ²½
λ‹€μŒ μ€„μ—λŠ” λ°±μ€€μ΄ μš΄μ „을 μ‹œμž‘ν•˜λŠ” μΉΈμ˜ ν–‰ λ²ˆν˜Έμ™€ μ—΄ λ²ˆν˜Έ
   ν–‰κ³Ό μ—΄ λ²ˆν˜ΈλŠ” 1 μ΄μƒ N μ΄ν•˜μ˜ μžμ—°μˆ˜, μš΄μ „을 μ‹œμž‘ν•˜λŠ” μΉΈμ€ λΉˆμΉΈ
κ·Έλ‹€μŒ μ€„λΆ€ν„° M개의 μ€„에 κ±Έμ³ κ° μŠΉκ°μ˜ μΆœλ°œμ§€μ˜ ν–‰κ³Ό μ—΄ λ²ˆν˜Έ, λͺ©μ μ§€μ˜ ν–‰κ³Ό μ—΄ λ²ˆν˜Έ
   λͺ¨λ“  μΆœλ°œμ§€μ™€ λͺ©μ μ§€λŠ” λΉˆμΉΈ, λͺ¨λ“  μΆœλ°œμ§€λŠ” μ„œλ‘œ λ‹€λ₯΄λ©°, κ° μ†λ‹˜μ˜ μΆœλ°œμ§€μ™€ λͺ©μ μ§€λŠ” λ‹€λ¦„
import copy
from collections import deque

# N X N 격자판, Mλͺ…μ˜ 승객, 초기 μ—°λ£Œμ˜ μ–‘ K
n, m, k = map(int, input().split())
graph = []

for i in range(n):
    # N개의 쀄에 걸쳐 백쀀이 ν™œλ™ν•  μ˜μ—­μ˜ 지도 (0은 빈칸, 1은 λ²½)
    data = list(map(int, input().split()))
    array = []
    for d in data:
        # 벽이 μžˆλŠ” 뢀뢄을 -1, 아무것도 μ—†λŠ” 뢀뢄은 -2
        if d == 1:
            array.append(-1)
        else:
            array.append(-2)
    graph.append(array)

dx = [-1, 1, 0, 0]
dy = [0, 0, 1, -1]
# 백쀀이 μš΄μ „μ„ μ‹œμž‘ν•˜λŠ” 칸의 ν–‰ λ²ˆν˜Έμ™€ μ—΄ 번호
t_x, t_y = map(int, input().split())
# 1λΆ€ν„° μ‹œμž‘ν•˜κΈ°μ— μ‰½κ²Œ μ—°μ‚° ν•˜κΈ° μš°ν•΄μ„œ -1 빼주자!
t_x -= 1
t_y -= 1

# M개의 쀄에 걸쳐 각 승객의 μΆœλ°œμ§€μ˜ ν–‰κ³Ό μ—΄ 번호, λͺ©μ μ§€μ˜ ν–‰κ³Ό μ—΄ 번호
customer = []
for _ in range(m):
    # νƒμ‹œ 고객의 ν˜„μž¬ μœ„μΉ˜μ™€ λͺ©μ μ§€μ˜ μœ„μΉ˜λ₯Ό μ €μž₯
    a, b, c, d = map(int, input().split())
    customer.append([a, b, c, d])


# μ†λ‹˜κ³Όμ˜ 거리 계산
def customer_dist(graph, t_x, t_y):
    g = copy.deepcopy(graph)
    visited = [[False] * n for _ in range(n)]
    queue = deque()
    # νƒμ‹œ
    queue.append((t_x, t_y))
    # νƒμ‹œ μžˆλŠ” 곳은 λΉˆμΉΈμž„
    g[t_x][t_y] = 0
    visited[t_x][t_y] = True

    while queue:
        x, y = queue.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 > nx or n <= nx or 0 > ny or n <= ny:
                continue
            if g[nx][ny] == -1 or visited[nx][ny] == True:
                continue
            g[nx][ny] = g[x][y] + 1
            visited[nx][ny] = True
            queue.append((nx, ny))
    # 거리둜 가득찬 graph!
    return g


while True:
    # μ—°λ£Œ λΆ€μ‘±
    if k < 0:
        break
    # μ†λ‹˜ 끝!
    if len(customer) == 0:
        break
    move = []
    gg = customer_dist(graph, t_x, t_y)

    # νƒμ‹œ - μ†λ‹˜
    for c in customer:
        # νƒμ‹œ 고객의 ν˜„μž¬ μœ„μΉ˜μ™€ λͺ©μ μ§€μ˜ μœ„μΉ˜λ₯Ό μ €μž₯
        a, b, c, d = c
        dis = gg[a - 1][b - 1]
        if dis < 0:
            continue
        move.append([dis, a - 1, b - 1, c - 1, d - 1])
    if len(move) == 0:
        # μ—°λ£ŒλŠ” ν•œ μΉΈ 이동할 λ•Œλ§ˆλ‹€ 1만큼 μ†Œλͺ¨
        k = -1
        break
    else:
        # 거리 λ‚΄λ¦Όμ°¨μˆœ - ν–‰ λ‚΄λ¦Όμ°¨μˆœ - μ—΄ λ‚΄λ¦Όμ°¨μˆœ
        move.sort(key=lambda x: (x[0], x[1], x[2]))
        # 고객 μœ„μΉ˜ κΉŒμ§€ μ—°λ£Œ λΆ€μ‘±ν•˜λ©΄ 쀑단
        if move[0][0] > k:
            k = -1
            break
        else:
            # 고객 μœ„μΉ˜μ˜ 거리 만큼 μ—°λ£Œ 차감
            k -= move[0][0]
            # νƒμ‹œμœ„μΉ˜ = κ³ κ°ν˜„μž¬ μœ„μΉ˜, 고객 λͺ©μ μ§€ μœ„μΉ˜
            t_x, t_y, a, b = move[0][1:]
            # λ§ˆμ§€λ§‰ λͺ©μ μ§€κΉŒμ§€μ˜ νƒμ‹œ 거리 graph
            end = customer_dist(graph, t_x, t_y)
            # λͺ©μ μ§€ κΉŒμ§€μ˜ 거리
            d = end[a][b]

            if d < 0:
                # 
                k = -1
                break
            # 거리만큼 μ—°λ£Œ λΉΌκΈ°
            k -= d
            if k >= 0:
                k += (d * 2)
                customer.remove([t_x + 1, t_y + 1, a + 1, b + 1])
                # μ†λ‹˜μ˜ λͺ©μ μ§€κ°€ 이제 νƒμ‹œ μœ„μΉ˜
                t_x, t_y = a, b
            else:
                # μ—°λ£ŒλŠ” ν•œ μΉΈ 이동할 λ•Œλ§ˆλ‹€ 1만큼 μ†Œλͺ¨
                k = -1
                break

print(k)

예제 μž…λ ₯

6 3 15
0 0 1 0 0 0
0 0 1 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 1 0
0 0 0 1 0 0
6 5
2 2 5 6
5 4 1 6
4 2 3 5

예제 좜λ ₯

14

 

728x90
λ°˜μ‘ν˜•
Comments