알고리즘 풀이/SWEA

[SWEA 2382] 미생물 격리

mhko411 2021. 9. 12. 14:12
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