728x90

www.acmicpc.net/problem/5014

 

5014번: 스타트링크

첫째 줄에 F, S, G, U, D가 주어진다. (1 ≤ S, G ≤ F ≤ 1000000, 0 ≤ U, D ≤ 1000000) 건물은 1층부터 시작하고, 가장 높은 층은 F층이다.

www.acmicpc.net

최솟값이나 최단시간이 나오면 항상 BFS부터 의심해보자.

버튼을 최소횟수만 눌러서 g층까지 가는 것이므로 BFS로 풀면 된다.

해당 층에 방문한 적이 있다면 다시 방문할 필요가 없다.

BFS는 처음에 방문했을 때가 반드시 최단시간이라는 것이 보장되어 있기 때문이다.

그리고 최고층인 f층보다 높이 갈 수 없고 최저층인 1층보다 낮게 갈 수 없으므로 현재 층 + u가 f보다 크거나 현재층 - d가 1보다 작으면 큐에 넣어주지 않는다.

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int main() {
	cin.tie(NULL);
	ios::sync_with_stdio(false);
	int f, s, g, u, d;
	cin >> f >> s >> g >> u >> d;
	vector<bool> visited(f + 1, false);
	queue<pair<int, int>> q; // 현재 층, 현재까지 누른 버튼의 횟수
	q.push(make_pair(s, 0));
	int answer = -1;
	while (!q.empty()) {
		pair<int, int> cur = q.front();
		q.pop();
		if (cur.first == g) {
			answer = cur.second;
			break;
		}
		if (!visited[cur.first]) {
			visited[cur.first] = true;
			if (cur.first + u <= f) {
				q.push(make_pair(cur.first + u, cur.second + 1));
			}
			if (cur.first - d >= 1) {
				q.push(make_pair(cur.first - d, cur.second + 1));
			}
		}
	}
	if (answer == -1) {
		cout << "use the stairs";
	}
	else {
		cout << answer;
	}
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 16234번 인구 이동  (0) 2021.01.18
[백준] 1339번 단어 수학  (0) 2021.01.18
[백준] 12100번 2048 (Easy)  (0) 2021.01.18
[백준] 1915번 가장 큰 정사각형  (0) 2021.01.17
[백준] 14226번 이모티콘  (0) 2021.01.17

+ Recent posts