Skip to content

Commit 7180c24

Browse files
committed
[Gold III] Title: 나무 재테크, Time: 236 ms, Memory: 79916 KB -BaekjoonHub
1 parent 94d8c52 commit 7180c24

2 files changed

Lines changed: 180 additions & 0 deletions

File tree

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# [Gold III] 나무 재테크 - 16235
2+
3+
[문제 링크](https://www.acmicpc.net/problem/16235)
4+
5+
### 성능 요약
6+
7+
메모리: 79916 KB, 시간: 236 ms
8+
9+
### 분류
10+
11+
구현, 자료 구조, 시뮬레이션
12+
13+
### 제출 일자
14+
15+
2025년 9월 29일 17:18:01
16+
17+
### 문제 설명
18+
19+
<p>부동산 투자로 억대의 돈을 번 상도는 최근 N×N 크기의 땅을 구매했다. 상도는 손쉬운 땅 관리를 위해 땅을 1×1 크기의 칸으로 나누어 놓았다. 각각의 칸은 (r, c)로 나타내며, r은 가장 위에서부터 떨어진 칸의 개수, c는 가장 왼쪽으로부터 떨어진 칸의 개수이다. r과 c는 1부터 시작한다.</p>
20+
21+
<p>상도는 전자통신공학과 출신답게 땅의 양분을 조사하는 로봇 S2D2를 만들었다. S2D2는 1×1 크기의 칸에 들어있는 양분을 조사해 상도에게 전송하고, 모든 칸에 대해서 조사를 한다. 가장 처음에 양분은 모든 칸에 5만큼 들어있다.</p>
22+
23+
<p>매일 매일 넓은 땅을 보면서 뿌듯한 하루를 보내고 있던 어느 날 이런 생각이 들었다.</p>
24+
25+
<blockquote>
26+
<p><strong>나무 재테크를 하자!</strong></p>
27+
</blockquote>
28+
29+
<p>나무 재테크란 작은 묘목을 구매해 어느정도 키운 후 팔아서 수익을 얻는 재테크이다. 상도는 나무 재테크로 더 큰 돈을 벌기 위해 M개의 나무를 구매해 땅에 심었다. 같은 1×1 크기의 칸에 여러 개의 나무가 심어져 있을 수도 있다.</p>
30+
31+
<p>이 나무는 사계절을 보내며, 아래와 같은 과정을 반복한다.</p>
32+
33+
<p>봄에는 나무가 자신의 나이만큼 양분을 먹고, 나이가 1 증가한다. 각각의 나무는 나무가 있는 1×1 크기의 칸에 있는 양분만 먹을 수 있다. 하나의 칸에 여러 개의 나무가 있다면, 나이가 어린 나무부터 양분을 먹는다. 만약, 땅에 양분이 부족해 자신의 나이만큼 양분을 먹을 수 없는 나무는 양분을 먹지 못하고 즉시 죽는다.</p>
34+
35+
<p>여름에는 봄에 죽은 나무가 양분으로 변하게 된다. 각각의 죽은 나무마다 나이를 2로 나눈 값이 나무가 있던 칸에 양분으로 추가된다. 소수점 아래는 버린다.</p>
36+
37+
<p>가을에는 나무가 번식한다. 번식하는 나무는 나이가 5의 배수이어야 하며, 인접한 8개의 칸에 나이가 1인 나무가 생긴다. 어떤 칸 (r, c)와 인접한 칸은 (r-1, c-1), (r-1, c), (r-1, c+1), (r, c-1), (r, c+1), (r+1, c-1), (r+1, c), (r+1, c+1) 이다. 상도의 땅을 벗어나는 칸에는 나무가 생기지 않는다.</p>
38+
39+
<p>겨울에는 S2D2가 땅을 돌아다니면서 땅에 양분을 추가한다. 각 칸에 추가되는 양분의 양은 A[r][c]이고, 입력으로 주어진다.</p>
40+
41+
<p>K년이 지난 후 상도의 땅에 살아있는 나무의 개수를 구하는 프로그램을 작성하시오.</p>
42+
43+
### 입력
44+
45+
<p>첫째 줄에 N, M, K가 주어진다.</p>
46+
47+
<p>둘째 줄부터 N개의 줄에 A배열의 값이 주어진다. r번째 줄의 c번째 값은 A[r][c]이다.</p>
48+
49+
<p>다음 M개의 줄에는 상도가 심은 나무의 정보를 나타내는 세 정수 x, y, z가 주어진다. 처음 두 개의 정수는 나무의 위치 (x, y)를 의미하고, 마지막 정수는 그 나무의 나이를 의미한다.</p>
50+
51+
### 출력
52+
53+
<p>첫째 줄에 K년이 지난 후 살아남은 나무의 수를 출력한다.</p>
54+
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
import Foundation
2+
3+
struct Tree {
4+
var age: Int
5+
}
6+
7+
func readInts() -> [Int] {
8+
return readLine()!.split(separator: " ").map { Int($0)! }
9+
}
10+
11+
func FTS() {
12+
let nmk = readInts()
13+
let N = nmk[0]
14+
let M = nmk[1]
15+
let K = nmk[2]
16+
17+
var A = [[Int]](repeating: [Int](repeating: 0, count: N), count: N)
18+
for i in 0..<N {
19+
A[i] = readInts()
20+
}
21+
22+
// 현재 땅의 양분
23+
var nutrients = [[Int]](repeating: [Int](repeating: 5, count: N), count: N)
24+
25+
// 각 칸의 나무들, 나이 오름차순
26+
var trees = Array(repeating: Array(repeating: [Int](), count: N), count: N)
27+
28+
for _ in 0..<M {
29+
let line = readInts()
30+
let x = line[0]-1
31+
let y = line[1]-1
32+
let z = line[2]
33+
trees[x][y].append(z)
34+
}
35+
36+
// 초기 입력 정렬
37+
for i in 0..<N {
38+
for j in 0..<N {
39+
trees[i][j].sort()
40+
}
41+
}
42+
43+
// 8방향
44+
let dx = [-1,-1,-1,0,0,1,1,1]
45+
let dy = [-1,0,1,-1,1,-1,0,1]
46+
47+
for _ in 0..<K {
48+
// 봄 & 여름
49+
var deadNutrients = [[Int]](repeating: [Int](repeating: 0, count: N), count: N)
50+
51+
for i in 0..<N {
52+
for j in 0..<N {
53+
if trees[i][j].isEmpty { continue }
54+
55+
var newTrees = [Int]()
56+
var deadSum = 0
57+
58+
// 나이가 어린 순서대로 양분 섭취
59+
for age in trees[i][j] {
60+
if nutrients[i][j] >= age {
61+
nutrients[i][j] -= age
62+
newTrees.append(age+1)
63+
} else {
64+
// 여름에 양분으로 변환
65+
deadSum += age / 2
66+
}
67+
}
68+
trees[i][j] = newTrees
69+
deadNutrients[i][j] = deadSum
70+
}
71+
}
72+
73+
// 여름: 죽은 나무가 양분으로 변환
74+
for i in 0..<N {
75+
for j in 0..<N {
76+
nutrients[i][j] += deadNutrients[i][j]
77+
}
78+
}
79+
80+
// 가을: 번식
81+
var toAdd = Array(repeating: Array(repeating: 0, count: N), count: N)
82+
83+
for i in 0..<N {
84+
for j in 0..<N {
85+
if trees[i][j].isEmpty { continue }
86+
for age in trees[i][j] {
87+
if age % 5 == 0 {
88+
for d in 0..<8 {
89+
let nx = i + dx[d]
90+
let ny = j + dy[d]
91+
if nx < 0 || nx >= N || ny < 0 || ny >= N { continue }
92+
toAdd[nx][ny] += 1
93+
}
94+
}
95+
}
96+
}
97+
}
98+
99+
for i in 0..<N {
100+
for j in 0..<N {
101+
if toAdd[i][j] > 0 {
102+
// 새 나무(나이 1)를 앞쪽에 추가하여 나이 순서 유지
103+
trees[i][j].insert(contentsOf: Array(repeating: 1, count: toAdd[i][j]), at: 0)
104+
}
105+
}
106+
}
107+
108+
// 겨울: 양분 추가
109+
for i in 0..<N {
110+
for j in 0..<N {
111+
nutrients[i][j] += A[i][j]
112+
}
113+
}
114+
}
115+
116+
// 살아있는 나무 수 출력
117+
var total = 0
118+
for i in 0..<N {
119+
for j in 0..<N {
120+
total += trees[i][j].count
121+
}
122+
}
123+
print(total)
124+
}
125+
126+
FTS()

0 commit comments

Comments
 (0)