보물창고 블로그

삼성 SW Expert Academy 5653. [모의 SW 역량테스트] 줄기세포배양 본문

알고리즘 풀이/SW Expert Academy

삼성 SW Expert Academy 5653. [모의 SW 역량테스트] 줄기세포배양

홋 메 2020. 1. 2. 14:33
728x90

문제 링크: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRJ8EKe48DFAUo

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

문제는 위의 링크에 나와있다.

해결한 코드는 다음과 같다.

class cell:
    def __init__(self,x,y,time):
        # hp는 비활성에서 활성화까지 남은 시간 혹은 활성화에서 죽을 때까지 시간
        self.hp=x
        # ahp는 활성화하는데 걸리는 시간
        self.ahp=x
        # 상태 0은 없음 1은 비활성 2는 활성 3은 죽음
        self.status=y
        # 생성된 시간
        self.time=time
def make_cell(x,y,w,t):
    px=[-1,0,1,0]
    py=[0,1,0,-1]
    for i in range(4):
        try:
            if map1[x+px[i]][y+py[i]].status==0:
                map1[x+px[i]][y+py[i]].status=1
                map1[x+px[i]][y+py[i]].hp=w
                map1[x+px[i]][y+py[i]].ahp=w
                map1[x+px[i]][y+py[i]].time=t
            elif map1[x+px[i]][y+py[i]].status==1 and map1[x+px[i]][y+py[i]].time==t:
                if w>map1[x+px[i]][y+py[i]].hp:
                    map1[x+px[i]][y+py[i]].hp=w
                    map1[x+px[i]][y+py[i]].ahp=w
                    
        except:
            continue
        
T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    n,m,k=map(int,input().split())
    t=0
    map1=[[cell(0,0,0) for _ in range(m+k)]for _ in range(n+k)]
    map2=[list(map(int,input().split())) for _ in range(n)]
    s=k//2
    for i in range(s,s+n):
        for j in range(s,s+m):
            if map2[i-s][j-s]!=0:
                map1[i][j].status=1
                map1[i][j].hp=map2[i-s][j-s]
                map1[i][j].ahp=map2[i-s][j-s]
    while(t<k):
        t+=1
        for i in range(n+k):
            for j in range(m+k):
                if map1[i][j].status==1 and map1[i][j].time<t:
                    map1[i][j].hp-=1
                    if map1[i][j].hp==0:
                        map1[i][j].status=2
                        map1[i][j].hp=map1[i][j].ahp
                        continue
                elif map1[i][j].status==2:
                    map1[i][j].hp-=1
                    if map1[i][j].hp==map1[i][j].ahp-1:
                        make_cell(i,j,map1[i][j].ahp,t)
                    if map1[i][j].hp==0:
                        map1[i][j].status=3
    count=0
    for i in range(n+k):
        for j in range(m+k):
            if map1[i][j].status==1 or map1[i][j].status==2:
                count+=1

    print('#{} {}'.format(test_case,count))
Comments