Skip to content

Commit b0893e9

Browse files
committed
[Silver I] Title: 푸앙이와 콩나무, Time: 16 ms, Memory: 10236 KB -BaekjoonHub
1 parent 1de57d3 commit b0893e9

2 files changed

Lines changed: 113 additions & 0 deletions

File tree

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# [Silver I] 푸앙이와 콩나무 - 33677
2+
3+
[문제 링크](https://www.acmicpc.net/problem/33677)
4+
5+
### 성능 요약
6+
7+
메모리: 10236 KB, 시간: 16 ms
8+
9+
### 분류
10+
11+
다이나믹 프로그래밍, 그래프 이론, 그래프 탐색, 너비 우선 탐색
12+
13+
### 제출 일자
14+
15+
2026년 2월 12일 11:55:26
16+
17+
### 문제 설명
18+
19+
<p>잭과 콩나무를 감명 깊게 읽은 푸앙이는 동화책에 나오는 신비한 힘을 지닌 콩을 구해 하늘나라에 있는 거인의 성에 올라가려고 한다. 하지만 신비한 힘을 지닌 콩을 구하지 못한 푸앙이는 대신 평범한 콩나무에 하루에 한 번씩 물을 주어 하늘나라에 올라가려 한다. 콩나무는 다음 규칙을 따라 자란다.</p>
20+
21+
<ul>
22+
<li>물을 <mjx-container class="MathJax" jax="CHTML" style="font-size: 111.4%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mn class="mjx-n"><mjx-c class="mjx-c31"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$1$</span></mjx-container>만큼 주면 다음 날 콩나무의 길이가 <mjx-container class="MathJax" jax="CHTML" style="font-size: 111.4%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mn class="mjx-n"><mjx-c class="mjx-c31"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$1$</span></mjx-container> 증가한다.</li>
23+
<li>물을 <mjx-container class="MathJax" jax="CHTML" style="font-size: 111.4%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mn class="mjx-n"><mjx-c class="mjx-c33"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>3</mn></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$3$</span></mjx-container>만큼 주면 다음 날 콩나무의 길이는 <mjx-container class="MathJax" jax="CHTML" style="font-size: 111.4%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mn class="mjx-n"><mjx-c class="mjx-c33"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>3</mn></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$3$</span></mjx-container>배가 된다.</li>
24+
<li>물을 <mjx-container class="MathJax" jax="CHTML" style="font-size: 111.4%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mn class="mjx-n"><mjx-c class="mjx-c35"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>5</mn></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$5$</span></mjx-container>만큼 주면 다음 날 콩나무의 길이는 제곱이 된다.</li>
25+
<li>다른 양의 물을 준 경우에는 콩나무의 길이가 변하지 않는다.</li>
26+
</ul>
27+
28+
<p><mjx-container class="MathJax" jax="CHTML" style="font-size: 111.4%; position: relative;"> <mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mn class="mjx-n"><mjx-c class="mjx-c30"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>0</mn></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$0$</span></mjx-container>번째 날의 초기 콩나무 길이는 <mjx-container class="MathJax" jax="CHTML" style="font-size: 111.4%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mn class="mjx-n"><mjx-c class="mjx-c30"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>0</mn></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$0$</span></mjx-container>이다. 푸앙이가 거인의 성에 도착하려면 콩나무의 길이가 정확히 <mjx-container class="MathJax" jax="CHTML" style="font-size: 111.4%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D441 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>N</mi></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$N$</span></mjx-container>이 되어야 하며, 콩나무의 길이가 <mjx-container class="MathJax" jax="CHTML" style="font-size: 111.4%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D441 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>N</mi></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$N$</span></mjx-container>이 된 날에 푸앙이는 거인의 성에 도착할 수 있게 된다. 푸앙이가 거인의 성에 도착하려면 적어도 며칠이 필요할지와 적어도 얼마나 물이 필요할 지 구해보자.</p>
29+
30+
### 입력
31+
32+
<p>첫 번째 줄에 거인의 성에 도착하기 위해 필요한 콩나무의 길이 <mjx-container class="MathJax" jax="CHTML" style="font-size: 111.4%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D441 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>N</mi></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$N$</span></mjx-container>이 주어진다.</p>
33+
34+
### 출력
35+
36+
<p>첫 번째 줄에 푸앙이가 거인의 성에 도착하기 위해 필요한 최소 일수와 최소 일수만에 거인의 성에 도착하기 위해 필요한 물의 양의 최솟값을 공백으로 구분하여 출력한다.</p>
37+
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#include <iostream>
2+
#include <queue>
3+
4+
using namespace std;
5+
6+
const int INF = 1e9;
7+
int N = 0;
8+
9+
int main() {
10+
cin >> N;
11+
12+
vector<int> days(N+1, INF);
13+
vector<int> waters(N+1, INF);
14+
15+
days[0] = 0;
16+
waters[0] = 0;
17+
18+
queue<int> q;
19+
q.push(0);
20+
21+
while (!q.empty()) {
22+
int c_len = q.front();
23+
q.pop();
24+
25+
int n_day = days[c_len] + 1;
26+
27+
// 1. c_len + 1
28+
if (c_len + 1 <= N) {
29+
int n_len = c_len + 1;
30+
int n_water = waters[c_len] + 1;
31+
32+
if (days[n_len] > n_day) {
33+
days[n_len] = n_day;
34+
waters[n_len] = n_water;
35+
q.push(n_len);
36+
} else if (days[n_len] == n_day && waters[n_len] > n_water) {
37+
waters[n_len] = n_water;
38+
q.push(n_len);
39+
}
40+
}
41+
42+
// 2. c_len * 3
43+
if (c_len * 3 <= N) {
44+
int n_len = c_len * 3;
45+
int n_water = waters[c_len] + 3;
46+
47+
if (days[n_len] > n_day) {
48+
days[n_len] = n_day;
49+
waters[n_len] = n_water;
50+
q.push(n_len);
51+
} else if (days[n_len] == n_day && waters[n_len] > n_water) {
52+
waters[n_len] = n_water;
53+
q.push(n_len);
54+
}
55+
}
56+
57+
// 3. c_len ** c_len
58+
if ((long long)c_len * c_len <= N) {
59+
int n_len = c_len * c_len;
60+
int n_water = waters[c_len] + 5;
61+
62+
if (days[n_len] > n_day) {
63+
days[n_len] = n_day;
64+
waters[n_len] = n_water;
65+
q.push(n_len);
66+
} else if (days[n_len] == n_day && waters[n_len] > n_water) {
67+
waters[n_len] = n_water;
68+
q.push(n_len);
69+
}
70+
}
71+
}
72+
73+
cout << days[N] << " " << waters[N] << "\n";
74+
75+
return 0;
76+
}

0 commit comments

Comments
 (0)