[Python] SW Expert Academy #5653 줄기세포 배양

이재원·2024년 4월 29일

Samsung SW Expert Academy

목록 보기
32/34

📚문제: #5653 줄기세포 배양(모의 SW 역량테스트)

전체 코드

# 5653. 줄기세포 배양

# 줄기세포 배양 함수
def Cultivation(G, k, t):
    
    # 상하좌우
    dr = [-1, 1, 0, 0]
    dc = [0, 0, -1, 1]

    # 배양 시간
    h = 0
    
    # K시간 동안 배양합니다.
    while h < k:
        
        # 갱신용 그리드
        temp_G = [[(0,0,0) for _ in range(351)] for _ in range(351)]
        
        for r in range(351):
            
            for c in range(351):
                
                # 줄기 세포 존재여부 조사
                if G[r][c] != (0,0,0):
                    
                    life, in_act_time, act_time = G[r][c]
                    
                    # 죽은 세포일 때, 자리를 차지한다.
                    if in_act_time == act_time and in_act_time != 0 and act_time != 0:
                        
                        temp_G[r][c] = (life, in_act_time, act_time)
                    
                    # 활성화 되어 살아있는 세포일 때, 활성화 시간 1 추가
                    elif life == in_act_time and act_time < life:
                        
                        # 번식
                        if act_time == 0:
                                
                            for p in range(4):
                                
                                move_r, move_c = r + dr[p], c + dc[p]
                                
                                # 이미 줄기세포가 있으면 번식하지 못한다.
                                if G[move_r][move_c] != (0,0,0):
                                    
                                    continue
                                        
                                else:
                                    
                                    life_2, in_act_time_2, act_time_2 = temp_G[move_r][move_c]
                                    
                                    # 갱신
                                    if life > life_2:
                                        
                                        temp_G[move_r][move_c] = (life, 0, 0)
            
                        temp_G[r][c] = (life, in_act_time, act_time + 1)
                    
                    # 비활성화 된 세포일 때
                    elif in_act_time < life:
                        
                        temp_G[r][c] = (life, in_act_time + 1, act_time)
        
        # 갱신
        G = []
        
        for p in range(351):
                   
            G.append(temp_G[p])
        
        # 시간 갱신
        h += 1

    # 죽은 줄기세포를 제외하고 개수를 세어준다.
    cell_cnt = 0
    
    for r in range(351):
        
        for c in range(351):
            
            # 줄기세포가 존재할 때
            if G[r][c] != (0,0,0):
                
                life, in_act_time, act_time = G[r][c]
                
                if in_act_time > 0 and act_time > 0 and in_act_time == act_time:
                    
                    continue
                
                else:
                    
                    cell_cnt += 1
                           
    # 답안 출력 (K시간 배양 후 배양 용기에 살아있는 줄기 세포 개수)
    print("#{} {}".format(t, cell_cnt))
    
# 테스트 케이스 T
T = int(input())

# 각 테스트 케이스가 주어진다.
for t in range(1, T+1):
    
    # 세로 N, 가로 M, 배양 시간 K
    N, M, K = map(int, input().split())
    
    # 그리드
    grid = [[(0,0,0) for _ in range(351)] for _ in range(351)]
    
    # 줄기세포 초기 위치
    init = []
    
    # 줄기세포 초기 위치 정보가 주어진다.
    for _ in range(N):
        
        init.append(list(map(int, input().split())))
    
    # 격자 확장
    for r in range(N):
        
        for c in range(M):
            
            if init[r][c]:
                
                # (생명력, 비활성 시간, 활성 시간)
                grid[r+150][c+150] = (init[r][c], 0, 0)
    
    # 함수 실행
    Cultivation(grid, K, t)

TIL

문제풀이를 위한 리스트 사용방식에 주의할 것, 리스트 안에 리스트를 선언하는 방식은 메모리, 시간 측면에서 비효율적일 수 있음.

0개의 댓글