상세 컨텐츠

본문 제목

파이썬으로 풀어보는 백준 16235번: 나무 재테크 (삼성 A형 기출 문제)

Python/문제풀이 (삼성 A형 대비)

by 코딩하는 낙타 2020. 2. 13. 12:03

본문

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
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
def go():
    die = []
    for t in tree:
        z = t[0]
        y = t[1]
        x = t[2]
 
        if arr[y][x] - z >= 0:
            arr[y][x] -= z
            t[0+= 1
        else:
            die.append(t)
 
    for di in die:
        tree.remove(di)
        z = di[0]
        y = di[1]
        x = di[2]
        arr[y][x] += (z//2)
 
    new = []
    for t in tree:
        z = t[0]
        if z % 5 == 0:
            y = t[1]
            x = t[2]
 
            for dir in range(8):
                ny = y + dy[dir]
                nx = x + dx[dir]
 
                if 0 <= ny <= N-1 and 0 <= nx <= N-1:
                    new.append([1, ny, nx])
 
    for a in new:
        tree.insert(0, a)
 
    for i in range(N):
        for j in range(N):
            arr[i][j] += feed[i][j]
 
 
N, M, K = map(int,input().split())
feed = [list(map(int,input().split())) for _ in range(N)]
arr = [[5* N for _ in range(N)]
tree = []
 
dy = [11100-1-1-1]
dx = [-101-11-101]
 
for _ in range(M):
    x, y, z = map(int,input().split())
    tree.append([z, y-1, x-1])
tree.sort()
 
for year in range(K):
    go()
 
print(len(tree))
 

PyPy3, 시간 초과

봄, 여름, 가을, 겨울 각각의 조건을 하나의 사이클로 코드를 구현하였다. 주의해야할 점은 나무가 죽자마자 양분을 추가해주면 문제 조건에 맞지 않다는 점이다. 때문에 나무가 죽었을 때 죽은 나무를 따로 저장해서 처리하여야 하는 것이 시간 초과에 가장 큰 원인이 된다고 생각한다.

 

 

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
def go():
    global tree
    die = []
    birth = []
    for t in tree:
        z = t[0]
        y = t[1]
        x = t[2]
 
        if arr[y][x] - z >= 0:
            arr[y][x] -= z
            t[0+= 1
            if t[0] % 5 == 0:
                birth.append(t)
        else:
            die.append(t)
 
    for di in die:
        tree.remove(di)
        z = di[0]
        y = di[1]
        x = di[2]
        arr[y][x] += (z//2)
 
    for t in birth:
        y = t[1]
        x = t[2]
 
        for dir in range(8):
            ny = y + dy[dir]
            nx = x + dx[dir]
 
            if 0 <= ny <= N-1 and 0 <= nx <= N-1:
                tree.insert(0, [1, ny, nx])
 
    for i in range(N):
        for j in range(N):
            arr[i][j] += feed[i][j]
 
 
N, M, K = map(int,input().split())
feed = [list(map(int,input().split())) for _ in range(N)]
arr = [[5* N for _ in range(N)]
tree = []
 
dy = [11100-1-1-1]
dx = [-101-11-101]
 
for _ in range(M):
    x, y, z = map(int,input().split())
    tree.append([z, y-1, x-1])
tree.sort()
 
for year in range(K):
    go()
 
print(len(tree))
 

PyPy3, 시간 초과

먼저 봄에 나무의 위치와 나이를 확인할 때 가을에 새로 태어날 나무를 미리 저장해두었다가 가을이 되면 다시 전체를 탐색할 필요없이 바로 추가해주는 방식으로 시간을 절약하였다.

관련글 더보기

댓글 영역