728x90

코드트리 - 숫자가 가장 큰 인접한 곳으로 동시에 이동

## 소요시간 30분!

# 접근 방법

  • 침착하게 문제에서 원하는 조건을 우선 정리해주었다.
  • 구슬은 상하좌우 가장 큰 곳으로 이동하며, 그러한 값이 여러 개일 경우 상하좌우 방향 순서대로 이동한다.
  • 또한, 구슬은 충돌하지 않고 *이동한 후에 * 2개 이상의 구슬 위치가 동일하다면 해당 위치의 구슬은 소멸한다.
  • 따라서, marbles 리스트를 주어진 입력 리스트의 크기와 동일하게 만들어주고, 초기의 구슬 위치를 1로 표시해준다.
  • 이후 t초 동안 marbles를 순회하며 구슬이 존재한다면
    • 입력받은 arr에서 4방향 중 주어진 조건으로 이동해야 되는 곳을 찾아준다.
    • 이 떄 주의해야 할 점은, 실시간으로 구슬의 위치를 옮겨주는 것이 아닌 저장을 해둔 뒤 빼야된다.
  • 모든 구슬의 이동이 끝났다면, 다시 marbles를 순회하며 2이상인 곳을 소멸 시켜준다.
def move():  
    cur = []  
    n_loc = []  
    for i in range(N):  
        for j in range(N):  
            if marbles[i][j]:  
                ni, nj = check(i, j)  
                cur.append((i, j))  
                n_loc.append((ni, nj))  

    if not cur:  
        return 0  
    for i, j in cur:  
        marbles[i][j] -= 1  
    for i, j in n_loc:  
        marbles[i][j] += 1  
    remove()  
    return 1  

def check(si, sj):  
    val = 0  
    vi, vj = -1, -1  
    for d in range(4):  
        ni, nj = si + di[d], sj + dj[d]  
        if 0<=ni<N and 0<=nj<N:  
            if arr[ni][nj] > val:  
                val = arr[ni][nj]  
                vi, vj = ni, nj  
    return vi, vj  

def remove():  
    for i in range(N):  
        for j in range(N):  
            if marbles[i][j] >= 2:  
                marbles[i][j] = 0  

N, M, T = map(int, input().split())  
arr = [list(map(int, input().split())) for _ in range(N)]  
marbles = [[0] * N for _ in range(N)]  
for _ in range(M):  
    a, b = map(int, input().split())  
    marbles[a-1][b-1] = 1  

# 상하좌우 순서  
di, dj = [-1, 1, 0, 0], [0, 0, -1, 1]  
for _ in range(T):  
    go = move()  
    if not go:  
        print(0)  
        break  
else:  
    result = 0  
    for i in marbles:  
        result += sum(i)  
    print(result)
728x90