베어_
TechBear
베어_
전체 방문자
오늘
어제
  • 분류 전체보기 (336)
    • Spring (33)
      • 개념 (13)
      • Security (5)
      • 실습 (1)
      • 토비 스프링 (11)
    • JPA (6)
    • 프로젝트 기록 (24)
    • DB (13)
    • JAVA (18)
    • 알고리즘 (50)
      • 유형정리 (8)
      • Baekjoon (21)
      • LeetCode (18)
    • 디자인패턴 (0)
    • 개발서적 (79)
      • Effective Java (78)
      • 객체지향의 사실과 오해 (1)
    • 독후감 (4)
    • 보안 (2)
    • 운영체제(OS) (53)
      • 공룡책 (53)
    • 컴퓨터 네트워크 (28)
      • 컴퓨터 네트워크 하향식 접근 (23)
    • 자료구조 (1)
    • DevOps (2)
    • 앱 개발 (20)
      • 안드로이드 스튜디오 (20)

블로그 메뉴

    공지사항

    인기 글

    태그

    • Spring
    • 백준
    • leetcode
    • java
    • 스프링
    • 스프링시큐리티
    • 이펙티브자바
    • C++
    • jpa
    • 스레드
    • 자바
    • 코드업
    • 함수형인터페이스
    • 데이터베이스
    • BFS
    • 토비스프링
    • 운영체제
    • dfs
    • 알고리즘
    • 자바8

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    베어_

    TechBear

    알고리즘/Baekjoon

    [백준] 5014 스타트링크 (JAVA)

    2022. 4. 7. 13:38

    ✉️문제

    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

     

    📝 접근

       먼저 문제를 예제를 통해 이해해보자. [ 10, 1, 10, 2, 1 ] 의 입력이 들어왔을 때 이는 다음과 같다. 

     -> 건물은 10층으로 구성되어 있고 강호는 현재 1층에 있다. 스타링크까지 가야하는데 현재 스타링크의 위치는 10층에 있으며, 올라갈 때는 2층씩 올라갈 수 있고 내려갈 때는 1층씩 내려갈 수 있다. 이 때의 최단 거리를 구하는 문제이다. 필자는 최단 거리를 구할 때는 보통 BFS를 이용하는 편이다.

     

    🗝 문제풀이

    package baekjoon;
    
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.Scanner;
    
    public class B5014 {
    
        static int[] dis = new int[1000001];
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
    
            int F = sc.nextInt(); // F층까지 있음
            int S = sc.nextInt(); // 강호의 위치
            int G = sc.nextInt(); // 스타 링크의 위치
            int U = sc.nextInt(); // 위로 가는 버튼
            int D = sc.nextInt(); // 아래로 가는 버튼
    
            BFS(F, S, G, U, D);
    
            int answer = dis[G] - 1; // 방문 체크를 위해서 1부터 시작했기 때문에 -1을 해야 한다.
            if(answer == -1) System.out.println("use the stairs"); 
            else System.out.println(answer);
        }
    
        public static void BFS(int f, int s, int g, int u, int d) {
            Queue<Integer> q = new LinkedList<>();
            q.add(s);
            dis[s] = 1;
            while(!q.isEmpty()) {
                int size = q.size();
                for(int i = 0; i < size; i++) {
                    int cur = q.poll();
                    if(s == g) return;
                    int nu = cur + u;
                    int nd = cur - d;
    
    		// 올라갈 때는 건물의 최대 높이인 f까지
                    if(nu <= f && dis[nu] == 0) {
                        q.add(nu);
                        dis[nu] = dis[cur] + 1;
                    }
    
    		// 내려갈 때는 건물의 최소 높이인 1까지
                    if(nd >= 1 && dis[nd] == 0) {
                        q.add(nd);
                        dis[nd] = dis[cur] + 1;
                    }
                }
            }
        }
    
    }

     

    // ==================================== 
    // 다음의 코드를 배열에 담아서 리팩토링하면 코드가 조금 간결해질 수 있다.
    if(nu <= f && dis[nu] == 0) {
        q.add(nu);
        dis[nu] = dis[cur] + 1;
    }
    
    if(nd >= 1 && dis[nd] == 0) {
        q.add(nd);
        dis[nd] = dis[cur] + 1;
    }

     

      '알고리즘/Baekjoon' 카테고리의 다른 글
      • [백준] 2573 빙산 (JAVA)
      • [백준] 2468 안전 영역 (JAVA)
      • [백준] 1697 숨바꼭질 (JAVA)
      • [백준] 7569 토마토 (JAVA)
      베어_
      베어_
      Today I learned | 문제를 해결하는 개발자

      티스토리툴바