[BOJ] 5014번 : 스타트링크
2024. 9. 18. 21:01ㆍAlgorithm
1. problem :
https://www.acmicpc.net/problem/5014
2. solution 1:
#include <bits/stdc++.h>
using namespace std;
int f, s, g, u, d;
typedef long long ll;
long long elev[1000005]; // 몇번째에 도착했는지 기록 ;
queue<int> Q;
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> f >> s >> g >> u >> d;
elev[s] = 1;
Q.push(s);
int dx[2] = { u,-d };
while (!Q.empty()) {
int cur = Q.front(); Q.pop();
for (int dir = 0; dir < 2; dir++) {
int nx = cur + dx[dir];
if (nx < 1 || nx > f || elev[nx]) continue;
elev[nx] = elev[cur] + 1ll;
Q.push(nx);
}
if (elev[g]) break;
}
if (!elev[g]) {
cout << "use the stairs" << '\n';
return 0;
}
cout << elev[g] - 1 << '\n';
}
bfs를 이용해 풀었다. 이때, 기존의 2차원 평면이 필요 없기에, 1차원 평면을 이용했다. 그에 따라, dx 축만 사용했다.
3. solution 2 :
// Authored by : std-freejia
// Co-authored by : BaaaaaaaaaaarkingDog
// http://boj.kr/8f34874217304e3ca3a499f672788d70
#include <bits/stdc++.h>
using namespace std;
int f, s, g, u, d;
int dist[1000002];
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> f >> s >> g >> u >> d;
fill(dist+1, dist+f+1, -1);
queue<int> q;
dist[s] = 0; // 현재 위치의 거리를 0으로 둠
q.push(s); // s층에서 시작
while(!q.empty()){
int cur = q.front(); q.pop();
for(auto nxt : {cur + u, cur - d}){
if(nxt > f || nxt <= 0 || dist[nxt] != -1) continue;
dist[nxt] = dist[cur] + 1;
q.push(nxt);
}
}
if(dist[g] == -1) cout << "use the stairs";
else cout << dist[g];
}
source code 출처 : https://github.com/encrypted-def/basic-algo-lecture/blob/master/0x09/solutions/5014.cpp
basic-algo-lecture/0x09/solutions/5014.cpp at master · encrypted-def/basic-algo-lecture
바킹독의 실전 알고리즘 강의 자료. Contribute to encrypted-def/basic-algo-lecture development by creating an account on GitHub.
github.com
이 코드가 훨씬 빠르게 동작했다. 메모리 소비도 훨씬 줄었다. auto nx : {cur + u , cur - d}를 이용했다는 점과 long long을 int로 바꿨다는 점이 크게 작용했던 것 같다.
'Algorithm' 카테고리의 다른 글
[BOJ] 6593번 : 상범 빌딩 (0) | 2024.09.19 |
---|---|
[BOJ] 2468번 : 안전 영역 (0) | 2024.09.18 |
[BOJ] 2748번 : 피보나치 수 2 (0) | 2024.09.18 |
[BOJ] 1759번 : 암호 만들기 (1) | 2024.09.16 |
[BOJ] 2667번 : 단지번호붙이기 (0) | 2024.09.13 |