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
'ALGORITHM > 정렬, 탐색,구현' 카테고리의 다른 글
[코드트리] 파이썬 - 꼬리잡기 (1) | 2023.10.11 |
---|---|
[코드트리] 파이썬 - 합쳐지는 구슬들 (1) | 2023.10.10 |
[백준 17142번] 파이썬 - 연구소 3 (0) | 2023.10.09 |
[백준 5549번] 파이썬 - 행성 탐사 (0) | 2023.10.07 |
[코드트리] 파이썬 - 핀볼게임 (0) | 2023.10.06 |