[Python] SW Expert Academy #2382 미생물 격리

이재원·2024년 4월 23일

Samsung SW Expert Academy

목록 보기
28/34

📚문제: #2382 미생물 격리(모의 SW 역량테스트)

전체 코드

# 2382 미생물 격리

from copy import deepcopy

# 함수
def isolation(n, m, t, G):
    
    # 4방향, 상하좌우(1234)
    dr = [-1, 1, 0, 0]
    dc = [0, 0, -1, 1]
    
    # 군집 들의 이동, m시간동안 지속
    for _ in range(m):
        
        temp_G = [[[] for _ in range(n)] for _ in range(n)]
        
        for r in range(n):
            
            for c in range(n):
                
                if G[r][c]:
                    
                    # [i,j]에 위치한 미생물을 모두 처리
                    for microbe in G[r][c]:
                        
                        # 미생물 수, 이동방향
                        microbe_N, moving_dir = microbe
                        
                        # 이동좌표
                        move_r, move_c = r + dr[moving_dir-1], c + dc[moving_dir-1]
                        
                        # 이동좌표가 약품이 칠해진 셀에 도착할 때
                        if (move_r in [0, n-1]) or (move_c in [0, n-1]):
                            
                            # 소수점 이하는 버린다.(2로 나눈 몫만 취한다.)
                            microbe_N = microbe_N // 2
                            
                            # 미생물 수가 0이 되면 군집이 사라진다.
                            if microbe_N == 0:
                                
                                continue
                            
                            else:
                                
                                # 기존방향 상에서 새로운방향 하
                                if moving_dir == 1:
                                    
                                    temp_G[move_r][move_c].append((microbe_N, 2))
                                
                                # 기존방향 하에서 새로운방향 상
                                elif moving_dir == 2:
                                    
                                    temp_G[move_r][move_c].append((microbe_N, 1))
                                    
                                # 기존방향 좌에서 새로운방향 우
                                elif moving_dir == 3:
                                    
                                    temp_G[move_r][move_c].append((microbe_N, 4))
                                    
                                # 기존방향 우에서 새로운방향 좌
                                elif moving_dir == 4:
                                    
                                    temp_G[move_r][move_c].append((microbe_N, 3))
                        
                        # 이동좌표가 일반적인 셀일 때
                        else:
                            
                            temp_G[move_r][move_c].append((microbe_N, moving_dir))
                        
        # 군집들을 합친다.
        for r in range(n):
            
            for c in range(n):
                
                # 한 공간에 군집이 여러개일 때
                if len(temp_G[r][c]) > 1:
                    
                    # 미생물 수가 많은 순서대로 정렬한다.
                    temp_G[r][c].sort(key = lambda x:-x[0])
                    
                    new_moving_dir = temp_G[r][c][0][1]
                    
                    total = 0
                    
                    for microbe in temp_G[r][c]:
                        
                        total += microbe[0]
                    
                    temp_G[r][c].clear()
                    
                    # 하나로 합친다. 방향도 갱신한다.
                    temp_G[r][c].append((total, new_moving_dir))             
                    
        # 셀 갱신
        G = []
        for i in range(n):
            
            G.append(temp_G[i])
        
    # 남아있는 미생물의 수를 구한다.
    ans = 0
    
    for r in range(N):
        
        for c in range(N):
            
            if G[r][c]:
                
                ans += G[r][c][0][0]
                
    # 답안 출력
    print("#{} {}".format(t, ans))

# 테스트 케이스 T
T = int(input())

# T개의 테스트 케이스
for t in range(1, T+1):
    
    # 셀의 개수 N, 격리 시간 M, 미생물 군집의 개수 K가 순서대로 주어진다.
    N, M, K = map(int, input().split())
    
    # 셀 초기화
    cell = [[[] for _ in range(N)] for _ in range(N)]

    # K줄에 걸쳐서 미생물 군집의 정보가 주어진다.
    for _ in range(K):
        
        # 세로 위치, 가로 위치, 미생물 수, 이동 방향
        R, C, microbe_N, moving_dir = list(map(int, input().split()))
    
        # 셀에 추가 (미생물 수, 이동 방향)
        cell[R][C].append((microbe_N, moving_dir))
    
    # 함수 실행
    isolation(N, M, t, cell)

TIL

리스트가 크고 복잡할 때는 deepcopy를 사용하지 말고(시간초과 주요원인), for문 + slicing 사용할 것

0개의 댓글