하다보니

5014번-스타트링크 본문

알고리즘 풀이/백준

5014번-스타트링크

claire 2022. 2. 8. 12:59

처음에 제출한 코드 

/*
F층으로 이루어진 고층 건물, S는 현재 강호 위치, G는 도착지, U는 위로 U층 가는 버튼, D는 아래로 D층 가는 버튼. 
U와 D버튼만으로 도착지까지 이동을 한다.최소 몇 번을 눌러야 하는가?
*/

#include<bits/stdc++.h>
using namespace std;

int vis[1000002];

int main() {
	int f, s, g, u, d;
	cin >> f >> s >> g >> u >> d;
	if (s == g) {
		cout << 0;
		return 0;
	}
	queue<int> Q;
	Q.push(s);
	vis[s] = 1;
	while (!Q.empty()) {
		int cur = Q.front(); Q.pop();
		int ux = cur + u;
		int dx = cur - d;
		if (ux == g) {
			cout << vis[cur];
			return 0;
		}
		if (dx == g) {
			cout << vis[cur];
			return 0;
		}
		if (ux > f || ux < 1||vis[ux]>0)continue;
		Q.push(ux);
		vis[ux] = vis[cur]+1;
		
		if (dx > f || dx < 1 || vis[dx] > 0)continue;
		Q.push(dx);
		vis[dx] = vis[cur]+1;
	}
	cout << "use the stairs";

}

위의 코드의 문제는 if 문으로 ux의 조건을 검사하고 continue로 넘어가버리면 dx는 검사조차 할 수 없다는 것이다. 병렬적인 조건이 있을 때는 조심해서 검사하자. 

#include<bits/stdc++.h>
using namespace std;

int vis[1000002];

int main() {
	int f, s, g, u, d;
	cin >> f >> s >> g >> u >> d;
	queue<int> q;
	fill(vis+1, vis + f+1, -1);
	q.push(s);
	vis[s] = 0;
	while (!q.empty()) {
		int cur = q.front(); q.pop();
		for (auto nxt : { cur + u,cur - d }) {
			if (nxt<1 || nxt>f || vis[nxt] != -1)continue;
			q.push(nxt);
			vis[nxt] = vis[cur] + 1;
		}
	}
	if (vis[g] == -1)cout << "use the stairs";
	else cout << vis[g];
}

python 풀이

from collections import deque
f,s,g,u,d=map(int,input().split())
vis=[-1 for i in range(f+1)]
q=deque()
q.append(s)
vis[s]=0
while q:
    cur=q.popleft()
    for i in (cur-d,cur+u):
        if i<1 or i>f or vis[i]!=-1:
            continue
        q.append(i)
        vis[i]=vis[cur]+1
if vis[g]==-1:
    print("use the stairs")
else:
    print(vis[g])

'알고리즘 풀이 > 백준' 카테고리의 다른 글

1074번-Z  (0) 2022.02.08
11729번-하노이 탑 이동 순서  (0) 2022.02.08
5427번-불  (0) 2022.02.08
1629-곱셈  (0) 2022.02.07
2583번-영역 구하기  (0) 2022.02.07