https://www.acmicpc.net/problem/16235
내 풀이:
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 = [1, 1, 1, 0, 0, -1, -1, -1]
dx = [-1, 0, 1, -1, 1, -1, 0, 1]
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 = [1, 1, 1, 0, 0, -1, -1, -1]
dx = [-1, 0, 1, -1, 1, -1, 0, 1]
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, 시간 초과
먼저 봄에 나무의 위치와 나이를 확인할 때 가을에 새로 태어날 나무를 미리 저장해두었다가 가을이 되면 다시 전체를 탐색할 필요없이 바로 추가해주는 방식으로 시간을 절약하였다.
파이썬으로 풀어보는 백준 14890번: 경사로 (삼성 A형 기출 문제) (0) | 2020.02.13 |
---|---|
파이썬으로 풀어보는 백준 14503번: 로봇 청소기 (삼성 A형 기출 문제) (0) | 2020.02.13 |
파이썬으로 풀어보는 백준 15684번: 사다리 조작 (삼성 A형 기출 문제) (0) | 2020.02.13 |
파이썬으로 풀어보는 백준 17142번: 연구소 3 (삼성 A형 기출 문제) (0) | 2020.02.11 |
파이썬으로 풀어보는 백준 12100번: 2048 (삼성 A형 기출 문제) (0) | 2020.02.11 |
댓글 영역