백준 5014(스타트링크)

jh Seo·2022년 11월 22일
0

백준

목록 보기
83/180

개요

백준 5014번: 스타트링크

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

  • 출력
    첫째 줄에 강호가 S층에서 G층으로 가기 위해 눌러야 하는 버튼의 수의 최솟값을 출력한다. 만약, 엘리베이터로 이동할 수 없을 때는 "use the stairs"를 출력한다.

접근방식

  1. BFS방식으로 각 레벨의 queue의 front()마다
    up버튼 눌렀을때의 층수,
    down버튼 눌렀을 때의 층수
    두 층을 방문했는지 조사하고 방문 안했다면 큐에 넣어주는 식으로 구현하였다.

  2. up버튼과 down버튼을 크기 2짜리 배열을 선언하여 반복문처리했다.

//up 층수, down 층수 저장용 배열
int dx[2];

//up과 down에 작동하게 반복문 설정
		for (int i = 0; i < 2; i++) {
			//i가 0일때 up, 1일때 down값
			int nextFlo = cur + dx[i];

코드

#include<iostream>
#include<queue>

using namespace std;
int totFlo=0, startFlo=0, goalFlo=0;
//4백만 바이트 ㄱㅊ
int visited[1'000'001];
//up 층수, down 층수 저장용 배열
int dx[2];
void input() {
	cin >> totFlo >> startFlo >> goalFlo >> dx[0] >> dx[1];
	//down이므로 -1곱해야함
	dx[1] *= -1;


}

void BFS() {
	//같다면 0출력
	if (startFlo == goalFlo) {
		cout << 0;
		return;
	}
	queue<int> q;
	visited[startFlo] = 1;
	q.push(startFlo);
	int level = 1;
	while (!q.empty()) {
		//큐사이즈는 가변적이라 변수에 할당
		int qSize = q.size();
		for (int i = 0; i < qSize; i++) {
			//큐front 변수에 할당 후 pop
			int cur = q.front();
			q.pop();
			//up과 down에 작동하게 반복문 설정
			for (int i = 0; i < 2; i++) {
				//i가 0일때 up, 1일때 down값
				int nextFlo = cur + dx[i];
				//다음 층수가 목표 층수면 
				if (nextFlo == goalFlo) {
					//해당 레벨 출력
					cout << level<<'\n';
					return;
				}
				//층수가 1보다 크거나 같고, 총 층수 안넘어가면
				if (nextFlo>=1 && nextFlo<totFlo) {
					//방문 안했다면
					if (!visited[nextFlo]) {
						//방문 처리 후
						visited[nextFlo] = true;
						//큐에 넣기
						q.push(nextFlo);
					}
				}
			}
			
		}
		//큐사이즈만큼 반복하고나면 레벨 하나 조사 끝났으므로 레벨 ++
		level++;
	}
	//반복문 빠져나왔다면 해당 값을 못찾은 것이므로 계단써라 출력
	cout << "use the stairs";
	return;
	
}

void solution() {
	BFS();
}

int main() {
	input();
	solution();
}

문풀후생

실수한 부분은
시작층수와 타겟층수가 같을때 처리, down층수 받아온 값에 -1 안 곱함,
총 층수 범위는 1층부터 totFlo층까지인데 층수 범위를
시작층수~ totFLo층으로 정해버렸다.

profile
코딩 창고!

0개의 댓글