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

[BAEKJOON python] 19237_μ–΄λ₯Έ 상어 λ³Έλ¬Έ

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

[BAEKJOON python] 19237_μ–΄λ₯Έ 상어

μ§•μ§•μ•ŒνŒŒμΉ΄ 2023. 4. 8. 21:48
728x90
λ°˜μ‘ν˜•
μ–΄λ₯Έ μƒμ–΄
상어가 μ‚¬λŠ” κ³΅κ°„에 λ” μ΄μƒ λ¬Όκ³ κΈ°λŠ” μ˜€μ§€ μ•Šκ³  λ‹€λ₯Έ μƒμ–΄λ“€λ§Œμ΄ λ‚¨μ•„μžˆλ‹€
μƒμ–΄μ—λŠ” 1 μ΄μƒ M μ΄ν•˜μ˜ μžμ—°μˆ˜ λ²ˆν˜Έκ°€ λΆ™μ–΄ μžˆκ³ , λͺ¨λ“  λ²ˆν˜ΈλŠ” μ„œλ‘œ λ‹€λ₯΄λ‹€
상어듀은 μ˜μ—­μ„ μ‚¬μˆ˜ν•˜κΈ° μœ„ν•΄ λ‹€λ₯Έ μƒμ–΄λ“€μ„ μ«“μ•„λ‚΄λ €κ³  ν•˜λŠ”데,
1의 λ²ˆν˜Έλ₯Ό κ°€μ§„ μ–΄λ₯Έ μƒμ–΄λŠ” κ°€μž₯ κ°•λ ₯ν•΄μ„œ λ‚˜λ¨Έμ§€ λͺ¨λ‘λ₯Ό μ«“μ•„λ‚Ό μˆ˜ μžˆλ‹€

N×N ν¬κΈ°μ˜ κ²©μž μ€‘ M개의 μΉΈμ— μƒμ–΄κ°€ ν•œ λ§ˆλ¦¬μ”© λ“€μ–΄ μžˆλ‹€
1) λ§¨ μ²˜μŒμ—λŠ” λͺ¨λ“  μƒμ–΄κ°€ μžμ‹ μ˜ μœ„μΉ˜μ— μžμ‹ μ˜ λƒ„μƒˆλ₯Ό λΏŒλ¦°λ‹€
2) 1μ΄ˆλ§ˆλ‹€ λͺ¨λ“  μƒμ–΄κ°€ λ™μ‹œμ— μƒν•˜μ’Œμš°λ‘œ μΈμ ‘ν•œ μΉΈ μ€‘ ν•˜λ‚˜λ‘œ μ΄λ™ν•˜κ³ , μžμ‹ μ˜ λƒ„μƒˆλ₯Ό κ·Έ μΉΈμ— λΏŒλ¦°λ‹€
3) λƒ„μƒˆλŠ” μƒμ–΄κ°€ k번 μ΄λ™ν•˜κ³  λ‚˜λ©΄ μ‚¬λΌμ§„λ‹€

각 μƒμ–΄κ°€ μ΄λ™ λ°©ν–₯을 κ²°μ •ν•  λ•ŒλŠ”, λ¨Όμ € μΈμ ‘ν•œ μΉΈ μ€‘ μ•„무 λƒ„μƒˆκ°€ μ—†λŠ” μΉΈμ˜ λ°©ν–₯으둜 μž‘λŠ”λ‹€
그런 μΉΈμ΄ μ—†μœΌλ©΄ μžμ‹ μ˜ λƒ„μƒˆκ°€ μžˆλŠ” μΉΈμ˜ λ°©ν–₯으둜 μž‘λŠ”λ‹€
    κ°€λŠ₯ν•œ μΉΈμ΄ μ—¬λŸ¬ κ°œμΌ μˆ˜ μžˆλŠ”데, κ·Έ κ²½μš°μ—λŠ” νŠΉμ •ν•œ μš°μ„ μˆœμœ„
    μš°μ„ μˆœμœ„λŠ” μƒμ–΄λ§ˆλ‹€ λ‹€λ₯Ό μˆ˜ μžˆκ³ , κ°™μ€ μƒμ–΄λΌλ„ ν˜„μž¬ μƒμ–΄κ°€ λ³΄κ³  μžˆλŠ” λ°©ν–₯에 λ”°λΌ λ‹€λ¦„
    μƒμ–΄κ°€ λ§¨ μ²˜μŒμ— λ³΄κ³  μžˆλŠ” λ°©ν–₯은 μž…λ ₯으둜 μ£Όμ–΄μ§€κ³ , κ·Έ ν›„μ—λŠ” λ°©κΈˆ μ΄λ™ν•œ λ°©ν–₯이 λ³΄κ³  μžˆλŠ” λ°©ν–₯이 λœλ‹€
λͺ¨λ“  μƒμ–΄κ°€ μ΄λ™ν•œ ν›„ ν•œ μΉΈμ— μ—¬λŸ¬ λ§ˆλ¦¬μ˜ μƒμ–΄κ°€ λ‚¨μ•„ μžˆμœΌλ©΄,
    κ°€μž₯ μž‘은 λ²ˆν˜Έλ₯Ό κ°€μ§„ μƒμ–΄λ₯Ό μ œμ™Έν•˜κ³  λͺ¨λ‘ κ²©μž λ°–μœΌλ‘œ μ«“κ²¨λ‚œλ‹€

1번 μƒμ–΄λ§Œ κ²©μžμ— λ‚¨κ²Œ λ˜κΈ°κΉŒμ§€ λͺ‡ μ΄ˆκ°€ κ±Έλ¦¬λŠ”지λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨
1,000μ΄ˆκ°€ λ„˜μ–΄λ„ λ‹€λ₯Έ μƒμ–΄κ°€ κ²©μžμ— λ‚¨μ•„ μžˆμœΌλ©΄ -1을 μΆœλ ₯

첫 μ€„μ—λŠ” N, M, kκ°€ μ£Όμ–΄μ§„λ‹€ (2 ≤ N ≤ 20, 2 ≤ M ≤ N2, 1 ≤ k ≤ 1,000)
κ·Έ λ‹€μŒ μ€„λΆ€ν„° N개의 μ€„에 κ±Έμ³ κ²©μžμ˜ λͺ¨μŠ΅
    0은 λΉˆμΉΈμ΄κ³ , 0이 μ•„λ‹Œ μˆ˜ xλŠ” x번 μƒμ–΄κ°€ λ“€μ–΄μžˆλŠ” μΉΈμ„ μ˜λ―Έ
κ·Έ λ‹€μŒ μ€„μ—λŠ” κ° μƒμ–΄μ˜ λ°©ν–₯
    1, 2, 3, 4λŠ” κ°κ° μœ„, μ•„λž˜, μ™Όμͺ½, μ˜€λ₯Έμͺ½
κ·Έ λ‹€μŒ μ€„λΆ€ν„° κ° μƒμ–΄μ˜ λ°©ν–₯ μš°μ„ μˆœμœ„κ°€ μƒμ–΄ λ‹Ή 4쀄씩 μ°¨λ‘€λŒ€λ‘œ μ£Όμ–΄μ§„λ‹€
    μ²« λ²ˆμ§Έ μ€„은 ν•΄λ‹Ή μƒμ–΄κ°€ μœ„λ₯Ό ν–₯ν•  λ•Œμ˜ λ°©ν–₯ μš°μ„ μˆœμœ„
    λ‘ λ²ˆμ§Έ μ€„은 μ•„λž˜λ₯Ό ν–₯ν•  λ•Œμ˜ μš°μ„ μˆœμœ„
    μ„Έ λ²ˆμ§Έ μ€„은 μ™Όμͺ½μ„ ν–₯ν•  λ•Œμ˜ μš°μ„ μˆœμœ„
    λ„€ λ²ˆμ§Έ μ€„은 μ˜€λ₯Έμͺ½μ„ ν–₯ν•  λ•Œμ˜ μš°μ„ μˆœμœ„
    κ° μš°μ„ μˆœμœ„μ—λŠ” 1λΆ€ν„° 4κΉŒμ§€μ˜ μžμ—°μˆ˜
    κ°€μž₯ λ¨Όμ € λ‚˜μ˜€λŠ” λ°©ν–₯이 μ΅œμš°μ„ 
맨 μ²˜μŒμ—λŠ” κ° μƒμ–΄λ§ˆλ‹€ μΈμ ‘ν•œ λΉˆ μΉΈμ΄ μ‘΄μž¬
import copy
# N×N 크기의 격자 쀑 M마리의 상어가 ν•œ λ§ˆλ¦¬μ”©, k 초 λ™μ•ˆ λƒ„μƒˆ μœ μ§€
n, m, k = map(int, input().split())
# 0은 빈칸이고, 0이 μ•„λ‹Œ 수 xλŠ” x번 상어 (μƒμ–΄μ˜ 번호둜 쑴재 ν‘œμ‹œ)
sea = [list(map(int, input().split())) for _ in range(n)]
# μƒμ–΄μ˜ λƒ„μƒˆν‘œν˜„ μœ„ν•΄ λƒ„μƒˆ 타이머, μƒμ–΄μ˜ 번호
smell = [[[0, 0] for _ in range(n)] for _ in range(n)]
# 각 μƒμ–΄μ˜ λ°©ν–₯ (1, 2, 3, 4λŠ” 각각 μœ„, μ•„λž˜, μ™Όμͺ½, 였λ₯Έμͺ½)
s_dir = [0] + list(map(int, input().split()))
dir = [[]]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
# 각 μƒμ–΄μ˜ λ°©ν–₯ μš°μ„ μˆœμœ„
for i in range(m):
    array = []
    for j in range(4):
        array.append(list(map(int, input().split())))
    dir.append(array)


# 1) 상어 이동
def move(sea):
    global out
    s = copy.deepcopy(sea)
    for i in range(n):
        for j in range(n):
            if sea[i][j] == 0:
                continue
            # 상어 번호
            s_n = s[i][j]
            # 상어 번호둜 λ°©ν–₯ 확인
            d = s_dir[s_n]
            x, y = i, j
            what = False

            for p in range(4):
                nd = dir[s_n][d - 1][p]
                nx = x + dx[nd - 1]
                ny = y + dy[nd - 1]
                if not (0 <= nx < n and 0 <= ny < n):
                    continue
                # λƒ„μƒˆ 타이머, μƒμ–΄μ˜ 번호
                # μƒμ–΄μ˜ λƒ„μƒˆκ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ
                # 이동할 μœ„μΉ˜μ— λ§Œμ•½ 상어가 μ‘΄μž¬ν•˜μ§€ μ•Šλ‹€λ©΄ ν•΄λ‹Ή μœ„μΉ˜λ‘œ 상어λ₯Ό 이동
                if smell[nx][ny][1] == 0:
                    if s[nx][ny] == 0:
                        s[nx][ny] = sea[x][y]
                        s[x][y] = 0
                    # ν•΄λ‹Ή μœ„μΉ˜μ— 상어가 μ‘΄μž¬ν•œλ‹€λ©΄ μƒμ–΄μ˜ 숫자λ₯Ό λΉ„κ΅ν•΄μ„œ μˆ«μžκ°€ 더 크면
                    # κ·Έ 상어λ₯Ό ν‡΄μΆœ μ‹œν‚€κ³  ν‡΄μΆœ 상어 수λ₯Ό 1 증가
                    else:
                        if s[nx][ny] > s[x][y]:
                            s[nx][ny] = sea[x][y]
                        out += 1
                        s[x][y] = 0
                    s_dir[s_n] = nd
                    what = True
                    break
            if what:
                continue

            # 4λ°©ν–₯ λ‹€ λͺ¨λ‘ 상어 λƒ„μƒˆ λ‚œλ‹€λ©΄,
            # μƒμ–΄μ˜ λƒ„μƒˆκ°€ ν˜„μž¬ 상어 λ²ˆν˜Έμ— ν•΄λ‹Ήν•˜λŠ” λƒ„μƒˆλΌλ©΄ κ·Έ 곳으둜 이동
            for p in range(4):
                nd = dir[s_n][d - 1][p]
                nx = x + dx[nd - 1]
                ny = y + dy[nd - 1]
                if not (0 <= nx < n and 0 <= ny < n):
                    continue
                if smell[nx][ny][1] == s_n:
                    s[nx][ny] = sea[x][y]
                    s[x][y] = 0
                    s_dir[s_n] = nd
                    break
    return s


# 2) 상어 λƒ„μƒˆ 타이머
# ν˜„μž¬ μƒμ–΄μ˜ μœ„μΉ˜μ— λƒ„μƒˆλ₯Ό 뿌리고, move() ν•¨μˆ˜λ‘œ μƒμ–΄μ˜ 이동을 처리
def s_smell(k):
    for i in range(n):
        for j in range(n):
            if sea[i][j] != 0:
                # λƒ„μƒˆμ™€ 상어 번호
                smell[i][j][0], smell[i][j][1] = k, sea[i][j]


def smell_down():
    for i in range(n):
        for j in range(n):
            if smell[i][j][1] == 0:
                continue
            # λƒ„μƒˆ 1μ—μ„œ 0으둜 사라쑋
            if smell[i][j][0] == 1:
                smell[i][j][0], smell[i][j][1] = 0, 0
            # λƒ„μƒˆ -1
            else:
                smell[i][j][0] -= 1


count = 0
out = 0
while True:
    if count >= 1000:
        count = -1
        break
    s_smell(k)
    sea = copy.deepcopy(move(sea))
    count += 1
    # ν‡΄μΆœλœ μƒμ–΄μ˜ μˆ˜κ°€ (m-1)개, 즉 남은 상어 1마리면 끝~
    if out == m - 1:
        break
    smell_down()

print(count)

예제 μž…λ ₯

5 4 4
0 0 0 0 3
0 2 0 0 0
1 0 0 0 4
0 0 0 0 0
0 0 0 0 0
4 4 3 1
2 3 1 4
4 1 2 3
3 4 2 1
4 3 1 2
2 4 3 1
2 1 3 4
3 4 1 2
4 1 2 3
4 3 2 1
1 4 3 2
1 3 2 4
3 2 1 4
3 4 1 2
3 2 4 1
1 4 2 3
1 4 2 3

예제 좜λ ₯

14

 

 

μ΄λ²ˆκ±°λŠ” γ…‰{κΉŒλ” λ§ˆλ‹ˆ~

μ–΄λ €μ›Œλ”°! γ…Žγ…Ž ꡬλƒ₯ μ•½κ°„ μ „ νŽΈλ³΄λ‹¨ μ—…κ·Έλ ˆμ΄λ“œ γ…Ž

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

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