본문 바로가기

알고리즘/백준 문제풀기

BOJ 백준 5014 스타트링크

https://www.acmicpc.net/problem/5014

 

5014번: 스타트링크

문제 강호는 코딩 교육을 하는 스타트업 스타트링크에 지원했다. 오늘은 강호의 면접날이다. 하지만, 늦잠을 잔 강호는 스타트링크가 있는 건물에 늦게 도착하고 말았다. 스타트링크는 총 F층으로 이루어진 고층 건물에 사무실이 있고, 스타트링크가 있는 곳의 위치는 G층이다. 강호가 지금 있는 곳은 S층이고, 이제 엘리베이터를 타고 G층으로 이동하려고 한다. 보통 엘리베이터에는 어떤 층으로 이동할 수 있는 버튼이 있지만, 강호가 탄 엘리베이터는 버튼이 2개밖에 없

www.acmicpc.net

문제 풀이 )

 

    1. DP를 통한 풀이 ( 메모리, 시간 효율이 낮은 풀이 )

#include <cstdio>

#define TOTAL 0
#define START 1
#define DEST 2
#define UP 3
#define DOWN 4

#define SIZE 1000010

using namespace std;

int input[5] = { 0 };
int dp[SIZE] = { 0 };

void solution(int nCurFloor, int nDestFloor, int nCount)
{
	if (nCurFloor > input[TOTAL] || nCurFloor < 0) return;
	
	if (dp[nCurFloor] != 0 && dp[nCurFloor] <= nCount) return;

	dp[nCurFloor] = nCount;

	solution(nCurFloor + input[UP], nDestFloor, nCount + 1);
	solution(nCurFloor + input[DOWN], nDestFloor, nCount + 1);
}

int main()
{
	scanf("%d %d %d %d %d", 
		&input[TOTAL], &input[START], &input[DEST], &input[UP], &input[DOWN]);

	input[DOWN] = -input[DOWN];

	if (input[START] == input[DEST])
	{
		printf("0\n");
		return 0;
	}
	
	solution(input[START], input[DEST], 0);

	if (dp[input[DEST]] != 0) printf("%d\n", dp[input[DEST]]);
	else printf("use the stairs\n");

	return 0;
}

 

    2. 다른 풀이

 

    건물의 최대 층수까지 1층씩만 오른다고 가정했을 때,

최대 건물의 최대 층수만큼의 횟수 이전까진 도착해야할 층에 도달해야 한다.

 

    현재 내가 있는 층이 도착해야할 층보다 높거나 더 이상 올라가지 못하는 경우 내려가야 한다.

내려가는 것이 강제되었는데 0층 미만으로 내려가진다면, 도착할 수 없는 층임을 의미한다.

#include <cstdio>

#define TOTAL 0
#define START 1
#define DEST 2
#define UP 3
#define DOWN 4

using namespace std;

int input[5] = { 0 };

int main()
{
	scanf("%d %d %d %d %d", 
		&input[TOTAL], &input[START], &input[DEST], &input[UP], &input[DOWN]);

	int nCurFloor = input[START];

	for (int i = 0; nCurFloor > 0 && nCurFloor <= input[TOTAL] && i <= input[TOTAL]; i++)
	{
		if (nCurFloor == input[DEST])
		{
			printf("%d\n", i); return 0;
		}

		if (nCurFloor > input[DEST] || nCurFloor + input[UP] > input[TOTAL]) nCurFloor -= input[DOWN];
		else nCurFloor += input[UP];
	}
	printf("use the stairs\n");

	return 0;
}

 

'알고리즘 > 백준 문제풀기' 카테고리의 다른 글

BOJ 백준 2573 빙산  (0) 2019.05.11
BOJ 백준 3055 탈출  (0) 2019.05.10
BOJ 백준 2931 가스관 < DFS>  (0) 2019.04.14
BOJ 백준 16234 인구이동<BFS>  (0) 2019.02.18
BOJ 백준 1652 누울 자리를 찾아라 <수학>  (0) 2019.02.03