※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 28069번 문제인 김밥천국의 계단이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/28069
28069번: 김밥천국의 계단
첫 번째 줄에 계단 개수에 해당하는 $N$, 계단을 오르는 횟수 $K$가 주어진다. $(1 \leq N, K \leq 1\,000\,000)$
www.acmicpc.net
0번 계단에서 각 n번째 계단까지 올라가는 데에 x번 계단 오르기로 올라갈 수 있다면 x보다 큰 횟수 y로도 올라갈 수 있음을 관찰하자. 이는 0번 계단에서 2번 행동을 x와 y의 차만큼 반복하고 x번 계단 오르기를 하는 것으로 가능하다.
위의 관찰을 이용하면 N번 계단까지 필요한 최소 계단 오르기 횟수를 구해 그 값이 K보다 작거나 같은지를 판단하는 것으로 문제를 해결할 수 있다. 최소 계단 오르기 횟수는 각 계단을 노드로, 각 계단에서 이동할 수 있는 계단의 관계를 방향 에지로 갖는 그래프 모델링에서의 BFS를 이용해 구할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <queue>
using namespace std;
int N, K;
int dist[1000001];
queue<int> que;
void bfs() {
dist[0] = 1;
que.push(0);
while (!que.empty()) {
int cur = que.front(); que.pop();
int nxt1 = cur + 1, nxt2 = cur + cur / 2;
if (nxt1 <= 1000001 && !dist[nxt1]) {
dist[nxt1] = dist[cur] + 1;
que.push(nxt1);
}
if (nxt2 <= 1000001 && !dist[nxt2]) {
dist[nxt2] = dist[cur] + 1;
que.push(nxt2);
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
bfs();
cin >> N >> K;
if (dist[N] - 1 <= K) cout << "minigimbob";
else cout << "water";
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 28071 // C++] 승형이의 사탕 사기 (2) | 2023.12.03 |
---|---|
[BOJ 28070 // C++] 유니의 편지 쓰기 (1) | 2023.12.02 |
[BOJ 28068 // C++] I Am Knowledge (0) | 2023.11.30 |
[BOJ 28067 // C++] 기하가 너무 좋아 (0) | 2023.11.29 |
[BOJ 28066 // C++] 타노스는 요세푸스가 밉다 (0) | 2023.11.28 |