알고리즘/백준 문제풀이

[삼성SW역량][Python/BOJ] 백준 16235 나무재테크(구현)

개발자 덕구🐾 2022. 7. 21. 15:33
728x90

 

 

삼성...그저 구현...!

 

한 자리에 나무가 여러개가 있을 수 있으므로 각각의 값을 리스트로 설정해주어야한다. 

tree = [[[] for _ in range(n)] for i in range(n)] 이런 식으로 코드를 만들어 주어야한다. 

 

 

 

 

 

 

dx = [-1,-1,-1,0,0,1,1,1] 
dy = [-1,0,1,-1,1,-1,0,1]


    
                    
if __name__=="__main__" :
    n,m,k = map(int,input().split())
    # 매년 겨울 추가되는 영양분 
    plus_nutri = [list(map(int,input().split())) for i in range(n)]
    
    # 영양분 
    ground = [[5]*n for i in range(n)]
    # 트리의 나이 
    tree = [[[] for _ in range(n)]for i in range(n)]

    for i in range(m) :
        x,y,year = map(int,input().split())
        tree[x-1][y-1].append(year)
    
    for t in range(k) :
        
        # 봄
        for i in  range(n):
            for j in range(n) :
                if tree[i][j] :
                    tree[i][j].sort()
                    tmp_tree, dead_tree = [],0
                    
                    for age in  tree[i][j] :
                        if ground[i][j] >= age : # 영양분이 나이보다 많다면 
                            ground[i][j] -= age
                            age+=1 # 나무의 나이 1살 증가 
                            tmp_tree.append(age) 
                        else :
                            dead_tree+= age //2  # 영양분이 없다면 여름의 비료를 위해 
                            
                    # 여름 
                    ground[i][j] += dead_tree  
                    tree[i][j] = [] 
                    tree[i][j].extend(tmp_tree)  # 살아남은 나무들로 초기화 
        
        # 가을 
        for i in range(n) :
            for j in range(n) :
                if tree[i][j] :
                    for year in tree[i][j] :
                        if year>0 and year%5 ==0 :
                            for k in range(8) :
                                nx,ny = i + dx[k], j + dy[k]
                                if 0<=nx<n and 0<=ny<n :
                                    tree[nx][ny].append(1)
                # 겨울 
                # 영양분 보충 
                ground[i][j] += plus_nutri[i][j]                     
                        
    ans = 0
    for i in range(n) :
        for j in range(n) :
            # 해당 위치의 나무의 개수 
            ans += len(tree[i][j])

    print(ans)

 

 

 

 

약간 다른 코드 (복습하면서 나온 코드):  

근데 좀더 오래 걸림

 

dx = [1,0,-1,0,-1,-1,1,1]
dy = [0,1,0,-1,-1,1,1,-1]
            
     
            
if __name__=="__main__" :
    n,m,k = map(int,input().split())
    
    # 추가할 양분 
    extra = [list(map(int,input().split())) for i in range(n)]
    
    # 나무의 나이 
    mp = [[[] for i in range(n)] for i in  range(n)]
    
    # 초기 양분 
    energy = [[5]*n for i in range(n)]
    
    # 나무 심기 
    for i in range(m) :
        x,y,z = map(int,input().split())  
        mp[x-1][y-1].append(z)
        
    for _ in range(k) :
        
        # 봄 
        for i in range(n) :
            for j in range(n) :
                if len(mp[i][j]) >=1 :
                    dead_tree = 0
                    mp[i][j].sort()
                    tmp =[]
                    while mp[i][j] :
                        old = mp[i][j].pop(0)
                        if energy[i][j] >= old :
                            energy[i][j] -= old 
                            tmp.append(old+1)
                        else :
                            dead_tree+= old //2 
                    mp[i][j].extend(tmp) 
                    # 여름 
                    energy[i][j] += dead_tree
        # 가을 
        for i  in range(n) :
            for j in range(n) :
                if len(mp[i][j])>=1 :
                    for k in mp[i][j] :
                        if k%5 ==0 :
                            for dir in range(8) :
                                nx,ny = i+dx[dir], j + dy[dir]
                                if 0<=nx<n and 0<=ny<n :
                                    mp[nx][ny].append(1)
                # 겨울 
                energy[i][j] += extra[i][j]
    
    cnt = 0
    for i in range(n) :
        for j in range(n) :
            if len(mp[i][j])>=1 :
                cnt += len(mp[i][j]) 
    print(cnt)

 

 

 

 

참고 블로그 : 

https://chldkato.tistory.com/127

 

백준 16235 나무 재테크 (파이썬)

https://www.acmicpc.net/problem/16235 16235번: 나무 재테크 부동산 투자로 억대의 돈을 번 상도는 최근 N×N 크기의 땅을 구매했다. 상도는 손쉬운 땅 관리를 위해 땅을 1×1 크기의 칸으로 나누어 놓았다. 각

chldkato.tistory.com

 

반응형