본문 바로가기

ALGORITHM

백준 5014번 스타트링크

문제 이해

총 F층으로 이루어진 건물의 G층에 스타트링크가 위치한다.

강호는 현재 S층에서 G층으로 이동하려 한다.

엘리베이터는 위로 U층 올라가는 버튼, 아래로 D층 내려가는 버튼 두 가지다.

 

강호가 G층에 도착하기 위해 눌러야 하는 버튼의 수의 최솟값을 출력한다.

만약 엘리베이터로 G층까지 이동할 수 없다면 "use the stairs"를 출력한다.

 

풀이 설명

step이라는 배열을 두고, step[s]부터 시작해서 위, 아래로 이동하며 step[n]에 n층까지 이동하는 데 눌러야 할 최소 버튼 수를 저장하는 방법을 사용했다. 해결 방법은 다음과 같다.

 

1. F의 최댓값인 1,000,000 + 1 크기로 step 배열을 두고, -1로 초기화한다.

 

2. step[S]에 0을 저장하고 (S는 강호가 이동을 시작하는 층), 큐에 S를 넣는다.

 

3. 큐가 모두 비거나, G층에 도착할 때까지 반복하며 step[cur + U],  step[cur - D]에 step[cur] + 1 값을 저장해 준다.

cur은 큐의 가장 앞에 있는 값으로 현재 층이고, cur + U 와 cur - D는 각각 현재 층에서 U만큼 올라간, D만큼 내려간 층이다. 이 때, step[cur + U]나 step[cur - D]에 방문하지 않은 경우만 step값을 저장하고, 큐에 cur + U 또는 cur - D를 넣어준다.

 

4. 위의 탐색 결과로 step[G]가 -1이라면 G층을 방문하지 않은 상태이므로 "use the stairs"를 출력하고, 그렇지 않다면 step[G]를 출력해준다.

 

구현

// 5014번 스타트링크

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

#define MAX 1000000 + 1

int F, S, G, U, D;
int step[MAX];

queue<int> q;

int solution() {
	q.push(S);
	step[S] = 0;

	while (!q.empty()) {
		int cur = q.front();
		q.pop();
		
		if (cur == G) break;

		if (cur + U <= F && step[cur + U] == -1) {
			step[cur + U] = step[cur] + 1;
			q.push(cur + U);
		}
		if (cur - D > 0 && step[cur - D] == -1) {
			step[cur - D] = step[cur] + 1;
			q.push(cur - D);
		}
	}

	return step[G];
}

void init() {
	for (int i = 0; i <= F; i++) {
		step[i] = -1;
	}
}

int main() {
	cin >> F >> S >> G >> U >> D;
	init();

	int ans = solution();
	if (ans == -1) cout << "use the stairs";
	else cout << ans;

	return 0;
}

 

오류가 있었던 부분

step 배열을 -1이 아닌 0으로 초기화해 값이 0이면 방문하지 않았다고 판단했었다. 

이 방법은 위의 코드에서는 U가 0일 때 문제가 생긴다.

 

예를 들어 강호가 10층에서 출발하고, 9층에 있는 스타트링크 사무실로 이동하려 하고, U는 0, D는 1이라고 하자.

 

solution함수의 반복문 안에서 층 방문 여부를 확인하고 step에 값을 저장해주는 부분에서 cur + U를 방문했는지 먼저 확인하게 된다. 여기서 U가 0이기 때문에 cur + U는 10 + 0으로 결국 출발 층인 10층이 되고, 10층은 방문했는데도 방문하지 않았다고 판단하여 step[10]에 step[cur], 즉, step[10] = 0에 1을 더한 1이 저장된다.

 

그리고 cur - D를 방문했는지 확인한다. cur - D = 10 - 1로 9층인데, 9층은 방문하지 않았으므로 step[9]에 step[10]에 1을 더한 2가 저장된다. 

 

10층에서 9층으로 이동하는 데 버튼은 1번만 누르면 되지만, 2번이라는 결과를 내게 되는 것이다. 

 

이는 step을 -1로 초기화하여 step의 값이 -1이면 방문하지 않았다고 판단하고, 처음에 step[S]에는 0을 저장해 줌으로써 해결하였다.

 

문제 링크: www.acmicpc.net/problem/5014

'ALGORITHM' 카테고리의 다른 글

백준 2564번 경비원  (0) 2021.03.05
백준 1107번 리모컨  (0) 2020.09.08
백준 1476번 날짜 계산  (0) 2020.08.31
백준 1167번 트리의 지름  (0) 2020.08.29