728x90
접근
리스트를 원소로 갖는 2차원 리스트를 생성하여 미생물들의 개수와 방향을 넣었다. 이후에 미생물이 이동할 때 새로운 2차원 리스트에 이동한 미생물들을 대입하였다. 그리고 2개 이상의 미생물들이 모였을 때 합을 구하고 제일 많은 개수를 갖는 미생물의 방향을 구하여 업데이트하였다.
구현
- 다음은 미생물들이 이동하는 것을 구현한 함수이다.
- 먼저 기존의 미생물들이 들어있는 board를 탐색하여 해당 미생물을 이동시킨다.
- 이동시켰을 때 약품이 칠해져있는 곳일 때는 개수를 반으로 나누고 방향을 반대로 설정한다.
- 미생물의 개수가 1 이상일 때 새로운 위치에 대입한다.
- 모든 미생물들의 이동이 끝난 후에 2개 이상이 모여있는 곳은 미생물들을 하나씩 꺼내어 총합을 구한다.
- 이때 개수가 가장 많은 미생물의 방향도 구하여 총합과 해당 방향을 새롭게 넣는다.
def move(board):
new_board = [[[] for _ in range(N)] for _ in range(N)]
for y in range(N):
for x in range(N):
if board[y][x]:
c, d = board[y][x][0]
ny = y + dy[d]
nx = x + dx[d]
if check_range(ny, nx):
c //= 2
d = change_direction(d)
if c > 0:
new_board[ny][nx].append((c, d))
for y in range(N):
for x in range(N):
if len(new_board[y][x]) >= 2:
total = 0
max_value, direction = 0, 0
while new_board[y][x]:
c, d = new_board[y][x].pop()
total += c
if c > max_value:
max_value = c
direction = d
new_board[y][x].append((total, direction))
return new_board
전체 코드
test_case = int(input())
def check_range(y, x):
return y == 0 or y == N-1 or x == 0 or x == N-1
def change_direction(d):
if d == 1:
return 2
elif d == 2:
return 1
elif d == 3:
return 4
elif d == 4:
return 3
def move(board):
new_board = [[[] for _ in range(N)] for _ in range(N)]
for y in range(N):
for x in range(N):
if board[y][x]:
c, d = board[y][x][0]
ny = y + dy[d]
nx = x + dx[d]
if check_range(ny, nx):
c //= 2
d = change_direction(d)
if c > 0:
new_board[ny][nx].append((c, d))
for y in range(N):
for x in range(N):
if len(new_board[y][x]) >= 2:
total = 0
max_value, direction = 0, 0
while new_board[y][x]:
c, d = new_board[y][x].pop()
total += c
if c > max_value:
max_value = c
direction = d
new_board[y][x].append((total, direction))
return new_board
for tc in range(test_case):
N, M, K = map(int, input().split())
board = [[[] for _ in range(N)] for _ in range(N)]
dy = [0, -1, 1, 0, 0]
dx = [0, 0, 0, -1, 1]
for _ in range(K):
y, x, c, d = map(int, input().split())
board[y][x].append((c, d))
for _ in range(M):
board = move(board)
answer = 0
for y in range(N):
for x in range(N):
while board[y][x]:
c, d = board[y][x].pop()
answer += c
print("#{} {}".format(tc+1, answer))
'알고리즘 풀이 > SWEA' 카테고리의 다른 글
[SWEA 2105] 디저트 카페 (0) | 2021.09.28 |
---|---|
[SWEA 1949] 등산로 조성 (0) | 2021.09.13 |
[SWEA 2112] 보호 필름 (0) | 2021.09.10 |
[SWEA 5644] 무선 충전 (0) | 2021.09.06 |
[SWEA 2383] 점심 식사시간 (0) | 2021.09.01 |