[SWEA] 2382. [シミュレーションソフトウェア機能テスト]微生物分離


📚 質問する


https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV597vbqAH0DFAVl&categoryId=AV597vbqAH0DFAVl&categoryType=CODE&problemTitle=%EB%AF%B8%EC%83%9D%EB%AC%BC&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

📖 に答える


2 D配列のy軸には時間が含まれ,x軸には微生物クラスタ情報が含まれている.
絵で描きます.以下のようにします.

1つ目の位置は、配列された1次元に配置されます.
前の時間の配列で巡回し、微生物を移動させ、現在の配列に変化を入れる.
時間が経つにつれて,統合は可能であるが分離は不可能であるため,クラスタリングの数は減少または同じである.
条件文を用いて,微生物がエッジに到達すると微生物の数を減少させ,移動方向を反転させる論理を書く.
このとき、現在の配列に同じ位置の微生物が群集しているかどうかを決定する.
位置が同じ微生物の数が一緒にいる.
同じ位置にいると、微生物の数がより多くの位置に更新されます.
したがって,微生物数の最大値を変数として別途設定しなければならない.
時間が過ぎると、微生物の個数が増えてしまいます.

📒 コード#コード#

for tc in range(1, 1 + int(input())):
    n, time, k = map(int, input().split())  # n: 셀의 한 변의 길이, time: 격리 시간, k: 군집의 개수
    arr = [[] for _ in range(time + 1)]
    dy = [0, -1, 1, 0, 0]   # 상: 1, 하: 2, 좌: 3, 우: 4
    dx = [0, 0, 0, -1, 1]
    for i in range(k):      # 초기 위치 설정
        y, x, m, d = map(int, input().split())
        arr[0].append([y, x, m, d])

    for i in range(1, time + 1):
        for v in arr[i - 1]:        # 이전 미생물의 값들을 가져온다.
            ny = v[0] + dy[v[3]]    # 좌표를 이동방향으로 움직인다.
            nx = v[1] + dx[v[3]]
            m, d, m_max = v[2], v[3], v[2]  # 미생물의 수, 이동방향, 최대 미생물의 수(여러 개가 겹칠 때 사용)
            if ny == 0 or ny == n - 1:      # 위, 아래 끝에 도달한 경우
                m //= 2
                d = 3 - d
            if nx == 0 or nx == n - 1:      # 양 옆 끝에 도달한 경우
                m //= 2
                d = 7 - d
            for j in range(len(arr[i])):       # 같은 위치에 있는 경우
                if arr[i][j][0] == ny and arr[i][j][1] == nx:
                    if arr[i][j][4] < m_max:    # 미생물의 수가 더 많으면
                        arr[i][j][4] = m_max    # 최대 미생물의 수를 업데이트
                        arr[i][j][3] = d        # 방향을 바꿔준다(최대 미생물의 수일 때 방향이다)
                    arr[i][j][2] += m           # 미생물을 더해준다(같은 위치면 다 더한다)
                    break
            else:                           # 같은 위치에 존재하는 것이 없는 경우
                arr[i].append([ny, nx, m, d, m_max])

    result = 0
    for v in arr[-1]:   # 미생물의 값을 다 더한다.
        result += v[2]
    print(f'#{tc} {result}')

🔍 結果