Coding

[BOJ] 17143번: λ‚šμ‹œμ™•

λ‚¨λ°”μ˜€ 2023. 3. 18. 18:02

https://www.acmicpc.net/problem/17143

 

17143번: λ‚šμ‹œμ™•

λ‚šμ‹œμ™•μ΄ 상어 λ‚šμ‹œλ₯Ό ν•˜λŠ” 곳은 크기가 R×C인 격자판으둜 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. 격자판의 각 칸은 (r, c)둜 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. r은 ν–‰, cλŠ” 열이고, (R, C)λŠ” μ•„λž˜ κ·Έλ¦Όμ—μ„œ κ°€μž₯ 였λ₯Έμͺ½ μ•„λž˜μ— μžˆλŠ” 칸이닀.

www.acmicpc.net

문제 ν•΄κ²°

1. λ¬Έμ œλŠ” λ‚šμ‹œμ™•μ΄ C만큼 μ΄λ™ν•˜λ©΄ λλ‚˜κΈ° λ•Œλ¬Έμ— 1) 였λ₯Έμͺ½μœΌλ‘œ ν•œ μΉΈ μ΄λ™ν•œ ν›„ λ‚šμ‹œ 2) 상어 이동 이걸 C만큼 λ°˜λ³΅ν•΄μ£Όλ©΄ λœλ‹€.

2. λ‚šμ‹œλ₯Ό ν•  땐 κ·Έ μ—΄μ—μ„œ κ°€κΉŒμš΄ 행에 상어가 있으면 작고 λ‚˜μ„œ 상어λ₯Ό μ œκ±°ν•΄μ£Όλ©΄ λœλ‹€. (board[r][c] = 0 μž‘μ—… ν•„μš”)

3. λ‚šμ‹œκ°€ λλ‚¬μœΌλ©΄ 이동을 ν•΄μ£Όλ©΄ λ˜λŠ”λ°, 이 뢀뢄이 제일 고민이 많이 됐닀. μ²˜μŒμ—” 2쀑 for문으둜 board에 값이 있으면 속λ ₯만큼 이동해주렀고 ν–ˆλŠ”λ° 그러면 3쀑 포문이 λœλ‹€. μ‹œκ°„ μ΄ˆκ³Όκ°€ 걱정됐닀.

속λ ₯μ΄λž‘ ν˜„μž¬ μœ„μΉ˜λ₯Ό κ°€μ§€κ³  계산을 ν•΄μ„œ ν•œ λ²ˆμ— μœ„μΉ˜λ₯Ό μ •ν•΄μ£ΌλŠ” 경우λ₯Ό μƒκ°ν•΄λ³΄μ•˜λŠ”λ° μˆ˜ν•™μ‹,, 머리 μ“°κΈ° 싫어짐 일단 패슀

일단은 3쀑 포문으둜 ν•΄λ³΄μž! ν–ˆλŠ”λ° μ‹œκ°„μ΄ˆκ³Ό γ…Žγ…Ž γ…‹γ…‹

R, C, M = map(int, input().split())
board = [ [0] * C for _ in range(R) ]

for shark in range(M):
    r, c, s, d, z = map(int, input().split())
    board[r-1][c-1] = (s, d-1, z)

dx = [-1, 1, 0, 0]
dy = [0, 0, 1, -1]

def move():
    move_board = [ [0] * C for _ in range(R) ]
    for i in range(R):
        for j in range(C):
            if board[i][j]:
                r, c, s, d, z = i, j, board[i][j][0], board[i][j][1], board[i][j][2]

                for moving in range(s):
                    if (r == 0 and d == 0): d = 1
                    elif (c == 0 and d == 3):   d = 2
                    elif (r == (R-1) and d == 1):   d = 0
                    elif (c == (C-1) and d == 2):   d = 3

                    r += dx[d]
                    c += dy[d]

                if move_board[r][c]:
                    if move_board[r][c][2] < z:
                        move_board[r][c] = (s,d,z)
                else:
                    move_board[r][c] = (s,d,z)

    return move_board 

def solve(c):
    size = 0
    for x in range(R):
        if board[x][c] :
            size += board[x][c][2]
            board[x][c] = 0
            return size

    return size

result = 0
for i in range(C):
    result += solve(i)
    board = move()

print(result)

 

μ‹œκ°„ 초과 μ•ˆ λ‚˜κ²Œ ν•˜λ €λ©΄ 상어가 μ΄λ™ν•˜λŠ” μ‹œκ°„μ„ O(1)둜.. μ•„λž˜ μ½”λ“œλ‘œ 이동 ν•¨μˆ˜λ°”κΏ”μ£Όλ©΄ 톡과.. μ•œπŸ˜‡

def move_shark():
    move_board = [[0] * C for _ in range(R)]
    for i in range(R):
        for j in range(C):
            if board[x][y]:
            	r, c, s, d, z = i, j, board[i][j][0], board[i][j][1], board[i][j][2]

            total = s
            if d == 0 or d == 1:
                s %= 2 * R - 2
                while s:
                    if (r == R - 1 and d == 1) or (r == 0 and d == 0):
                        d ^= 1 
                    r += dx[d]
                    s -= 1
            else:
                s %= 2 * C - 2
                while s:
                    if (c == C - 1 and d == 2) or (c == 0 and d == 3):
                        d = (d - 2)^1 + 2
                    c += dy[d]
                    s -= 1
 
            if move_board[r][c] and move_board[r][c][2] > z:
                pass
            else:
                move_board[r][c] = (total, d, z)
                
    return move_board