본문 바로가기
Problem Solving/BOJ

[Python]16235. 나무 재테크

by 부르르 2019. 4. 10.

https://www.acmicpc.net/problem/16235

 

16235번: 나무 재테크

부동산 투자로 억대의 돈을 번 상도는 최근 N×N 크기의 땅을 구매했다. 상도는 손쉬운 땅 관리를 위해 땅을 1×1 크기의 칸으로 나누어 놓았다. 각각의 칸은 (r, c)로 나타내며, r은 가장 위에서부터 떨어진 칸의 개수, c는 가장 왼쪽으로부터 떨어진 칸의 개수이다. r과 c는 1부터 시작한다. 상도는 전자통신공학과 출신답게 땅의 양분을 조사하는 로봇 S2D2를 만들었다. S2D2는 1×1 크기의 칸에 들어있는 양분을 조사해 상도에게 전송하고, 모든

www.acmicpc.net


 

이 문제는 시뮬레이션 문제로 문제를 분석해서 코드를 짜는데 크게 어렵진 않았다.

다만 나무를 1차원 리스트로 통째로 관리해서 푼다면

데이터가 커질때 정렬하는 과정에서 어마어마하게 시간이 오래 걸리게 된다.

heapq를 사용한다고 해도 시간초과가 발생하므로, 

나무를 3차원 배열을 만든다음 2차원 평면에서 나무의 수를 1차원 리스트로 관리하는것이 시간초과를 방지할 수 있다.

 

 

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
def print_year(cnt, ground, tree):
    print("****** YEAR: {} ******".format(cnt))
    for i in range(len(ground)):
        print("{}\t\t{}".format(ground[i], tree[i]))
    print()
 
def main():
    global doPrint
    n, m, k = map(int, input().split())
    a = [list(map(int, input().split())) for _ in range(n)]
    tree = [[[] for _ in range(n)] for _ in range(n)]
    for _ in range(m):
        y,x,z = map(int, input().split())
        tree[y-1][x-1].append(z)
    ground = [[5]*for _ in range(n)]
    direction = ((-1-1), (-10), (-11), (0-1), (01), (1-1), (10), (11))
    cnt = 0
 
    if doPrint:
        print_year(cnt, ground, tree)
 
    while cnt != k:
 
        # 봄 & 여름
        for i in range(n):
            for j in range(n):
                if tree[i][j]:
                    dead = []
                    alive = []
 
                    # 봄
                    tree[i][j].sort()
                    while tree[i][j]:
                        yrs = tree[i][j].pop(0)
                        if ground[i][j] < yrs:
                            dead.append(yrs)
 
                        else:
                            ground[i][j] -= yrs
                            yrs += 1
                            alive.append(yrs)
                    tree[i][j].extend(alive)
 
                    #여름
                    while dead:
                        yrs = dead.pop(0)
                        ground[i][j] += (yrs // 2)
 
        #가을
        for i in range(n):
            for j in range(n):
                tr = tree[i][j][:]
                for yrs in tr:
                    if yrs % 5 == 0:
                        for d in direction:
                            ny, nx = i + d[0], j + d[1]
                            if 0 <= ny < n and 0 <= nx < n:
                                tree[ny][nx].append(1)
 
        # 겨울
        for i in range(n):
            for j in range(n):
                ground[i][j] += a[i][j]
 
        cnt += 1
 
        if doPrint:
            print_year(cnt, ground, tree)
 
    ans = 0
    for i in range(n):
        for j in range(n):
            ans += len(tree[i][j])
    print(ans)
 
if __name__=="__main__":
    doPrint = False # True 시 year마다 출력
    main()
cs
728x90
반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[Python]5373. 큐빙  (0) 2019.04.11
[Python]16939. 2x2x2 큐브  (0) 2019.04.10
[Python]16236. 아기 상어  (0) 2019.04.09
[Python]6064. 카잉 달력  (0) 2019.04.09
[Python]17136. 색종이 붙이기  (0) 2019.04.08

댓글