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

[BAEKJOON python] 17143_λ‚šμ‹œμ™• λ³Έλ¬Έ

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

[BAEKJOON python] 17143_λ‚šμ‹œμ™•

μ§•μ§•μ•ŒνŒŒμΉ΄ 2023. 4. 5. 22:00
728x90
λ°˜μ‘ν˜•
λ‚šμ‹œμ™•μ€ κ°€μž₯ μ˜€λ₯Έμͺ½ μ—΄μ˜ μ˜€λ₯Έμͺ½ μΉΈμ— μ΄λ™ν•˜λ©΄ μ΄λ™μ„ λ©ˆμΆ€
1초 λ™μ•ˆ μΌμ–΄λ‚˜λŠ” μΌ
1. λ‚šμ‹œμ™•μ΄ μ˜€λ₯Έμͺ½μœΌλ‘œ ν•œ μΉΈ μ΄λ™
2. λ‚šμ‹œμ™•μ΄ μžˆλŠ” μ—΄μ— μžˆλŠ” μƒμ–΄ μ€‘μ—μ„œ λ•…κ³Ό μ œμΌ κ°€κΉŒμš΄ μƒμ–΄λ₯Ό μž‘음
상어λ₯Ό μž‘으면 κ²©μžνŒμ—μ„œ μž‘은 μƒμ–΄κ°€ μ‚¬λΌμ§
3. μƒμ–΄κ°€ μ΄λ™
μƒμ–΄λŠ” μž…λ ₯으둜 μ£Όμ–΄μ§„ μ†λ„λ‘œ μ΄λ™ν•˜κ³ , μ†λ„μ˜ λ‹¨μœ„λŠ” μΉΈ/초
격자판의 κ²½κ³„λ₯Ό λ„˜λŠ” κ²½μš°μ—λŠ” λ°©ν–₯을 λ°˜λŒ€λ‘œ λ°”κΏ”μ„œ μ†λ ₯을 μœ μ§€ν•œμ±„λ‘œ μ΄λ™

상어가 μ΄λ™μ„ λ§ˆμΉœ ν›„에 ν•œ μΉΈμ— μƒμ–΄κ°€ λ‘ λ§ˆλ¦¬ μ΄μƒ μžˆμ„ μˆ˜ μžˆμŒ
크기가 κ°€μž₯ ν° μƒμ–΄κ°€ λ‚˜λ¨Έμ§€ μƒμ–΄λ₯Ό λͺ¨λ‘ μž‘μ•„λ¨ΉμŒ

λ‚šμ‹œμ™•μ΄ μƒμ–΄ λ‚šμ‹œλ₯Ό ν•˜λŠ” κ²©μžνŒμ˜ μƒνƒœκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, λ‚šμ‹œμ™•μ΄ μž‘은 μƒμ–΄ ν¬κΈ°μ˜ ν•©

첫째 μ€„에 κ²©μžνŒμ˜ ν¬κΈ° R, C와 μƒμ–΄μ˜ μˆ˜ M
λ‘˜μ§Έ μ€„λΆ€ν„° M개의 μ€„에 μƒμ–΄μ˜ μ •λ³΄
(r, c)λŠ” μƒμ–΄μ˜ μœ„μΉ˜, sλŠ” μ†λ ₯, dλŠ” μ΄λ™ λ°©ν–₯, zλŠ” ν¬κΈ°
dκ°€ 1 μœ„, 2 μ•„λž˜, 3 μ˜€λ₯Έμͺ½, 4 μ™Όμͺ½
두 μƒμ–΄κ°€ κ°™μ€ ν¬κΈ°λ₯Ό κ°–λŠ” κ²½μš°λŠ” μ—†κ³ , ν•˜λ‚˜μ˜ μΉΈμ— λ‘˜ μ΄μƒμ˜
# 격자판의 크기 R, C와 μƒμ–΄μ˜ 수 M
r, c, m = map(int, input().split())
# 뢁 - 남 - 동 - μ„œ
dx = [-1, 1, 0, 0]
dy = [0, 0, 1, -1]
# 3차원 λ°°μ—΄
graph = [[[] for _ in range(c)] for _ in range(r)]

for _ in range(m):
    # (r, c)λŠ” μƒμ–΄μ˜ μœ„μΉ˜, sλŠ” 속λ ₯, dλŠ” 이동 λ°©ν–₯, zλŠ” 크기
    x, y, s, d, z = map(int, input().split())
    # μƒμ–΄μ˜ 정보 (크기, 속λ ₯, 이동방ν–₯)을 μž…λ ₯λ°›μ•„ μ €μž₯
    graph[x - 1][y - 1].append([z, s, d - 1])


def moving():
    g = [[[] for _ in range(c)] for _ in range(r)]
    for i in range(r):
        for j in range(c):
            if graph[i][j]:
                x, y = i, j
                # μƒμ–΄μ˜ 정보 (크기, 속λ ₯, 이동방ν–₯)
                z, s, d = graph[i][j][0]
                s_count = s
                # 속λ ₯이 끝날 λ•Œ κΉŒμ§€ 반볡
                while s_count > 0:
                    nx = x + dx[d]
                    ny = y + dy[d]
                    # 경계선을 λ„˜μ–΄κ°„λ‹€λ©΄
                    if 0 > nx or nx >= r or ny < 0 or ny >= c:
                        # 뢁 -> 남, 남 -> 뢁, 동 -> μ„œ, μ„œ- > λ™μœΌλ‘œ λ°©ν–₯을 λ³€κ²½
                        if d in [0, 2]:
                            d += 1
                        elif d in [1, 3]:
                            d -= 1
                        continue
                    else:
                        x, y = nx, ny
                        s_count -= 1
                # g에 μ €μž₯된 μƒμ–΄μ˜ μœ„μΉ˜μ™€ 정보
                g[x][y].append([z, s, d])
    # graph λ¦¬μŠ€νŠΈμ— μ €μž₯
    for i in range(r):
        for j in range(c):
            graph[i][j] = g[i][j]


eat_count = 0

for i in range(c):
    for j in range(r):
        if graph[j][i]:
            # κ°€μž₯ κ°€κΉŒμš΄ 상어
            value = graph[j][i][0]
            # 먹어라!
            eat_count += value[0]
            # 없어져라!
            graph[j][i].remove(value)
            break
    # 1μ΄ˆλ™μ•ˆ 움직여!
    moving()

    for p in range(r):
        for q in range(c):
            # 두 마리 이상이 같은 칸에 μžˆμ„ 경우
            if len(graph[p][q]) >= 2:
                # λ¨Όμ € 정렬해봐! (큰 λ†ˆλΆ€ν„°)
                graph[p][q].sort(reverse=True)
                # 큰 λ†ˆμ΄ 1마리 될 λ•ŒκΉŒμ§€
                while len(graph[p][q]) >= 2:
                    # μ—†μ–΄μ Έλž‘! 먹어버렀! (였λ₯Έμͺ½ 없어지지둱 μž‘μ€ λ†ˆλΆ€ν„°)
                    graph[p][q].pop()
print(eat_count)

 


예제 μž…λ ₯ 1

4 6 8
4 1 3 3 8
1 3 5 2 9
2 4 8 4 1
4 5 0 1 4
3 3 1 2 7
1 5 8 4 3
3 6 2 1 2
2 2 2 3 5

예제 좜λ ₯ 1

22

 

쫌 μž¬λ°ŒλŠ” λ¬Έμ œμ—¬λ•…~

https://developer-ellen.tistory.com/60

이 λΆ„κΊΌ 참고함 γ…Žγ…Ž

μ°Έκ³ ν•΄μ„œ κ·ΈλŸ°κ°€ μ™„μ „ 이해 쏚쏚 잘 됨~~~

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