myt-algorithm-practice/Samsung SW Certi Adv

[Algorithm][C++] BOJ 5014 스타트링크

hotamul 2021. 9. 1. 15:37

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

 

5014번: 스타트링크

첫째 줄에 F, S, G, U, D가 주어진다. (1 ≤ S, G ≤ F ≤ 1000000, 0 ≤ U, D ≤ 1000000) 건물은 1층부터 시작하고, 가장 높은 층은 F층이다.

www.acmicpc.net

 

풀이 핵심

1. BFS 활용

2. visited 배열을 이용해 중복 방문 방지

3. 목적 층 G 에 도달하지 못하면 -1 return

 

코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <queue>
using namespace std;

int F, S, G;
int df[2]; // df[0] (UP), df[1] (DOWN)
int ans;

struct elevator {
	int floor, cnt;
};
queue<elevator> q;

int bfs() {
	bool *visited = new bool[F + 1];
	for (int i = 1; i <= F; i++) visited[i] = false;
	q.push({ S, 0 });
	visited[S] = true;
	while (!q.empty()) {
		elevator cur = q.front();
		q.pop();
		if (cur.floor == G) {
			delete[] visited;
			return cur.cnt;
		}
		for (int dir = 0; dir < 2; dir++) {
			int nf = cur.floor + df[dir];
			if (nf < 1 || nf > F) continue;
			if (visited[nf]) continue;
			q.push({ nf, cur.cnt + 1 });
			visited[nf] = true;
		}
	}
	delete[] visited;
	return -1;
}

int main() {
	scanf("%d %d %d %d %d", &F, &S, &G, &df[0], &df[1]);
	df[1] = -df[1]; // Down은 minus 부호로 바꾸어 준다.
	ans = bfs();
	if (ans == -1) printf("use the stairs");
	else printf("%d", ans);
	return 0;
}

 

아쉬운 점

문제 자체는 어렵지 않아 쉽게 풀 수 있었다.

항상 C언어를 이용해 구현하다 보니 STL 사용이 익숙지 않았다.

처음으로 STL queue를 활용해 보았는데 너무 편했다.

공부가 필요할 것 같다. (queue, vector...)

동적으로 할당할 때 한번에 0으로 전체 초기화 하는 방법이 뭐가 있을까? (calloc 말고)