728x90
시간 제한 1초, 메모리 제한 256MB
# 조건
- 강호는 코딩 교육을 하는 스타트업 스타트링크에 지원했다.
- 오늘은 강호의 면접날이다.
- 하지만, 늦잠을 잔 강호는 스타트링크가 있는 건물에 늦게 도착하고 말았다.
- 스타트링크는 총 F층으로 이루어진 고층 건물에 사무실이 있고, 스타트링크가 있는 곳의 위치는 G층이다.
- 강호가 지금 있는 곳은 S층이고, 이제 엘리베이터를 타고 G층으로 이동하려고 한다.
- 보통 엘리베이터에는 어떤 층으로 이동할 수 있는 버튼이 있지만, 강호가 탄 엘리베이터는 버튼이 2개밖에 없다.
- U버튼은 위로 U층을 가는 버튼, D버튼은 아래로 D층을 가는 버튼이다. (만약, U층 위, 또는 D층 아래에 해당하는 층이 없을 때는, 엘리베이터는 움직이지 않는다)
- 강호가 G층에 도착하려면, 버튼을 적어도 몇 번 눌러야 하는지 구하는 프로그램을 작성하시오.
- 만약, 엘리베이터를 이용해서 G층에 갈 수 없다면, "use the stairs"를 출력한다.
입력
- 첫째 줄에 F, S, G, U, D가 주어진다. (1 ≤ S, G ≤ F ≤ 1000000, 0 ≤ U, D ≤ 1000000)
- 건물은 1층부터 시작하고, 가장 높은 층은 F층이다.
출력
- 첫째 줄에 강호가 S층에서 G층으로 가기 위해 눌러야 하는 버튼의 수의 최솟값을 출력한다.
- 만약, 엘리베이터로 이동할 수 없을 때는 "use the stairs"를 출력한다.
# 접근 방법
- bfs를 활용하여 풀어주면 된다.
- 우선 현재 층이 목표 층보다 낮은데 D버튼의 값이 0이거나 높은데 U버튼의 값이 0인 경우 바로 use the stairs를 출력해준다.
- 그렇지 않은 경우 bfs() 함수를 실행해준다.
- 현재 층의 값을 q에 넣고 visited 배열에 1로 표시해준다.
- 이후, U버튼의 값을 더해준 val1, D버튼의 값을 빼준 val2 변수를 선언해주고, 범위 내이고 방문한 적 없다면 q에 담아준다.
- G 층에 도착한 경우 visited[G] -1을 return 해주고, 도착하지 못한 경우 use the stairs를 리턴해준다.
python 풀이
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
from collections import deque
def bfs():
q = deque()
q.append(S)
visited = [0] * 1000001
visited[S] = 1
while q:
now = q.popleft()
if now == G:
return visited[G] - 1
val1 = now + U
val2 = now - D
if val1 <= F and not visited[val1]:
q.append(val1)
visited[val1] = visited[now] + 1
if val2 > 0 and not visited[val2]:
q.append(val2)
visited[val2] = visited[now] + 1
return "use the stairs"
F, S, G, U, D = map(int, input().split())
if (S > G and D == 0) or (S < G and U == 0):
print("use the stairs")
exit()
print(bfs())
cpp 풀이
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int bfs(int _F, int _S, int _G, int u, int d) {
vector<bool> visited(_F + 1, false);
visited[_S] = true;
queue<int> q;
q.push(_S);
int cnt = 0;
while (!q.empty()) {
int n = q.size();
while (n--) {
int val = q.front();
if (val == _G) {
return cnt;
}
q.pop();
int up = u + val;
int down = val - d;
if (up <= _F && !visited[up]) {
q.push(up);
visited[up] = true;
}
if (down >= 1 && !visited[down]) {
q.push(down);
visited[down] = true;
}
}
cnt++;
}
return -1;
}
int main() {
int F, S, G, U, D;
cin >> F >> S >> G >> U >> D;
int result = bfs(F, S, G, U, D);
if (result >= 0) cout << result;
else cout << "use the stairs";
return 0;
}
728x90
'ALGORITHM > DFS, BFS, 그래프 탐색' 카테고리의 다른 글
[백준 17141번] 파이썬 - 연구소 2 (1) | 2024.02.12 |
---|---|
[백준 13565번] 파이썬 - 침투 (1) | 2024.01.17 |
[백준 2583번] 파이썬, c++ - 영역 구하기 (1) | 2023.12.31 |
[백준 3187번] 파이썬 - 양치기 꿍 (1) | 2023.12.27 |
[백준 12893번] 파이썬 - 적의 적 (1) | 2023.12.26 |