티스토리 뷰

알고리즘/백준

[BAEKJOON]5014 스타트링크

응애~ 개발자 2023. 2. 17. 16:42
728x90
반응형

문제 요약

  • 알고리즘 분류: bfs
  • 난이도:Silver1
  • 문제내용:
    • F 전체층, S 시작층, G 도착층, U  현재 위치에서 U칸 만큼 위로 감, D 현재 위치에서 D칸 만큼 아래로 감
    • 시작층에서 도착층까지 최소  몇번 버튼을 눌려야 되는지 출력해라 
    • 만약 도착 못하면 'use the stairs'을 출력해라
 

5014번: 스타트링크

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

www.acmicpc.net

문제풀이

 이번 문제는 BFS 탐색 문제이다.  BFS 탐색 알고리즘에 관한 자세한 설명은 여기에서 확인 해보면 알 수 있다.

 기존 BFS는 각 노드간의 탐색인데 이번에는 2차원 배열로 응용한 BFS 탐색이다. 노드 대신 1차원 배열로 변경 된것만 생각하면 된다.

문제 접근 방법

 이번 문제는 BFS와 배열 안의 위치 이동이다. 다만 노드로 탐색 할때는 방문 여부만 했지만 배열안에 넓이 탐색은 배열 범위 안에 탐색할수 있는 조건만 추가하면된다.

  위 그림은 엘레베이터의 버튼 이동을 그림 으로 포현한 것이다. i 위치에서 이동 할수 있는 범위는 I + U, I - D 층 2가지만 이동이 가능 한다. 그럼 어떻게 BFS 알고리즘으로 풀 것이라면 처음에는 모든 배열의 방문 여부를 확인 하는 배열 필요한데 그럼 이동횟수 배열이랑 따로 만들기에는 귀찮다 그래서 모든 배열은 -1로 초기화를 한다. 그다음 S층을 0으로 시작해서 BFS 탐색을 한다. 탐색 할때 범위 안에 있고 방문 안했을때 탐색한 층은 꺼낸 값에 + 1만 해주기만 하면 끝이다. G층에 도착하면 출력하면되고 아니면 도착 못했다는 메세지를 출력하면된다.

정리

  1. 이동횟수를 저장한 배열을 -1로 초기화한다.
  2. S층을 0으로 지정한다.
  3. BFS 탐색 한 범위이고 방문하지 않은 층은 꺼낸 값의 층에 +1을 해준다.

Code

python

from collections import deque

def bfs():
    queue = deque([S])
    elevator[S] = 0
    while queue:
        floor = queue.popleft()
        if floor == G: 
            print(elevator[G])
            return
        for next_floor in(floor + U , floor - D):
            if 0 < next_floor <= F and elevator[next_floor] == -1:
                elevator[next_floor] = elevator[floor] + 1
                queue.append(next_floor)
    print('use the stairs')

F, S, G, U, D = map(int, input().split())
elevator = [-1] * (F + 1)
bfs()

Java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
	
	static int[] elevator;
	static int F, S, G, U, D;
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		F = Integer.parseInt(st.nextToken());
		S = Integer.parseInt(st.nextToken());
		G = Integer.parseInt(st.nextToken());
		U = Integer.parseInt(st.nextToken());
		D = Integer.parseInt(st.nextToken());
		elevator  = new int[F + 1];
		Arrays.setAll(elevator, i -> -1);
		
		bfs();
	}
	
	public static void bfs() {
		Queue<Integer> queue = new LinkedList<Integer>();
		queue.add(S);
		elevator[S] = 0;
		
		int stair;
		while(!queue.isEmpty()) {
			stair = queue.poll();
			
			if(stair == G) {
				System.out.println(elevator[stair]);
				return;
			}
			if (0 < stair + U && stair + U <= F && elevator[stair + U] == -1) {
				elevator[stair + U] = elevator[stair] + 1;
				queue.add(stair + U);
			}
			
			if (0 < stair - D && stair - D <= F && elevator[stair - D] == -1) {
				elevator[stair - D] = elevator[stair] + 1;
				queue.add(stair - D);
			}
		}
		
		System.out.println("use the stairs");
	}
	
}
728x90
반응형

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

[BAEKJOON]1890 점프  (0) 2023.02.21
[BAEKJOON]1987 알파벳- Python  (0) 2023.02.20
[BAEKJOON]2583 영역 구하기  (0) 2023.02.16
[BAEKJOON]1309 동물원  (0) 2023.02.14
[BAEKJOON]1781 컵라면  (0) 2023.02.13
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함