SW expert 2382. 미생물 격리 -python

1949.등산로 조성

Posted by 동식이 블로그 on August 30, 2019

SWEA 2382. 미생물 격리 -python


문제풀이

  • 시뮬레이션 문제

  • 주어진 조건들을 잘 고려해서 처리해 주면 된다

    1. 1시간마다 이동방향에 있는 다음 셀로 이동
    2. 이동 후 약품이 칠해진 곳에 도착하면 미생물의 절반이 소멸
    3. 이동방향 바꿔주기
    4. 두 개 이상의 미생물 군집이 한 셀의 모이는 경우 미생물의 수를 더해주기
    5. 이동방향은 군집들 중 가장 많은 군집의 이동방향을 따른다
  • 나머지 조건들은 그냥 처리해주면 되지만 두 개 이상의 군집에서 3개 이상의 군집이 되었을 때를 처리해줘야한다

    • 예를들어 120 80 150의 미생물 집단이 있을 때 120 80중 큰것은 120이고 이를 더해주면 200이 된다
    • 그 후 200과 150을 비교했을 때 원래는 120 80 150중 150이 가장 크기 때문에 150을 선택해 주어야 하지만 이미 비교 후 더해버린 200과 150을 비교하면 안되므로 이 부분을 처리해 줘야한다.
    • 밑의 코드에서는 maxV에 같은것 중 큰 미생물 개수를, mavT에는 방향을 저장하고 첫번째로 나오는 미생물에 덮어씌워 주었다.

    이 문제를 풀고 다른 친구와 코드리뷰를 했는데 정렬을 해버리면 번잡한 처리 과정이 필요가 없었다는걸 깨닳았다. 문제는 정렬을 어떻게 해주냐인데 lamda를 통해 미생물 수를 기준으로 정렬하면 된다고 했다.

    lamda에대해서 조금 알아봐야겠다고 생각했다.


code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
T = int(input())

def move(arr, idx):
    if(arr[idx][3] == 1):
        arr[idx][0] -= 1
    elif(arr[idx][3] == 2):
        arr[idx][0] += 1
    elif(arr[idx][3] == 3):
        arr[idx][1] -= 1
    elif(arr[idx][3] == 4):
        arr[idx][1] += 1

def color(arr, idx):
    if(arr[idx][0] == 0 or arr[idx][1] == 0 or arr[idx][0] == n-1 or arr[idx][1] == n-1):
        arr[idx][2] = int(arr[idx][2]/2)
        if(arr[idx][3] == 1):
            arr[idx][3] = 2
        elif(arr[idx][3] == 2):
            arr[idx][3] = 1
        elif(arr[idx][3] == 3):
            arr[idx][3] = 4
        elif(arr[idx][3] == 4):
            arr[idx][3] = 3

def check(arr):
    for i in range(k):
        maxV = arr[i][2]
        maxT = arr[i][3]
        ssum = arr[i][2]
        for j in range(i+1,k):
            if(arr[i][0] == arr[j][0] and arr[i][1] == arr[j][1]):
                if(maxV < arr[j][2]):
                    ssum += arr[j][2] 
                    maxV = arr[j][2]
                    maxT = arr[j][3]
                    arr[j][2] = 0
                    arr[j][3] = 0
                else:
                    ssum += arr[j][2]
                    arr[j][2] = 0
                    arr[j][3] = 0
        arr[i][2] = ssum
        arr[i][3] = maxT

for tc in range(T):
    n, m, k = map(int, input().split())
    arr = [[0]*4 for i in range(k)]
    for i in range(k):
        arr[i] = list(map(int, input().split()))
    while(m > 0):
        for i in range(k):
            move(arr, i)
            color(arr, i)
        check(arr)
        m -= 1

    res = 0
    for i in range(len(arr)):
        res += arr[i][2]
    print("#{} {}".format(tc+1, res))