• 백준: 스타트링크
    코딩테스트 문제 풀이/다시 풀어볼 문제 2023. 11. 24. 00:01

    ChatGPT 코드

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.Deque;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.StringTokenizer;
    public class Main {
    static int F, S, G, U, D;
    static int[] visited;
    public static void main(String[] args) {
    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());
    visited = new int[F + 1];
    bfs();
    if (visited[G] == 0) {
    System.out.println("use the stairs");
    } else {
    System.out.println(visited[G] - 1);
    }
    }
    public static void bfs() {
    Queue<Integer> queue = new LinkedList<>();
    queue.offer(S);
    visited[S] = 1;
    while (!queue.isEmpty()) {
    int current = queue.poll();
    if (current == G) {
    break;
    }
    int up = current + U;
    int down = current - D;
    if (up <= F && visited[up] == 0) {
    queue.offer(up);
    visited[up] = visited[current] + 1;
    }
    if (down >= 1 && visited[down] == 0) {
    queue.offer(down);
    visited[down] = visited[current] + 1;
    }
    }
    }
    }

    이 문제는 왠지 풀 수 있을것 같아서 (단순해 보여서) 호기롭게 도전했다가 호되게 실패한 문제다.🥲

    이걸 미처 확인하지 못함...🥲

    그래서 ChatGPT에게 도움을 요청해봤다. 그런데 GPT가 한방에 해냄........!!!!!!

    🤓📝

    BFS를 사용한 이유

    이 문제를 BFS(너비 우선 탐색)로 푼 이유는 다음과 같습니다:

    1. 최소 이동 횟수 찾기

    BFS는 최단 경로 문제에서 최소 이동 횟수를 찾는 데 적합한 알고리즘입니다. 각 단계에서 가능한 모든 층을 방문하며, 최소 버튼 클릭 횟수를 찾습니다. 이 문제의 경우, U와 D 버튼을 사용하여 엘리베이터가 도달할 수 있는 층을 찾아야 하며, BFS는 이러한 목적에 적합합니다.

    2. 방문한 층 추적

    BFS를 사용하면 각 단계에서 방문한 층을 쉽게 추적할 수 있습니다. visited 배열을 사용하여 각 층의 방문 여부를 기록하고, 이를 통해 중복 방문을 방지할 수 있습니다. 이는 문제의 효율성을 높이고, 필요한 최소 클릭 횟수를 찾는 데 도움이 됩니다.

    3. 구현의 간결성

    BFS를 사용하면 구현이 상대적으로 간결하고 이해하기 쉽습니다. 각 단계에서 가능한 모든 층을 방문하며, 도달할 수 없는 층이 있는지 확인하는 과정을 반복합니다. 이는 코드를 작성하고 디버깅하는 데 도움이 됩니다.

    🤓📝

    소스 코드 분석

    1. 변수 생성, 초기화

    // 전역 변수 선언
    static int F, S, G, U, D;
    static int[] visited;
    // main ()
    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()); // 내려가는 층 단위 개수
    // 방문한 층에 누적 이동수 저장
    // 사용할 인덱스 : 1 ~ F
    visited = new int[F + 1];
    // bfs
    bfs()
    // 결과 출력
    if (visited[G] == 0) {
    // 목표층에 방문을 못했으면 문장 출력
    System.out.println("use the stairs");
    } else {
    // 시작 층도 카운팅 되서 1 빼줌
    System.out.println(visited[G]);
    }
     

    2. bfs() 메서드 구현

    public static void bfs() {
    Queue<Integer> queue = new LinkedList<>();
    queue.offer(S); // 시작 층 q에 입력
    visited[S] = 1; // 방문을 체크할 visited의 시작층에 1입력 -> 중복 방문 방지 (최소 방문 횟수 찾기 위함)
    while (!queue.isEmpty()) {
    int current = queue.poll(); // 현재 층 = 큐에서 값을 꺼냄
    // 현재 층이 목표층이면 멈춤
    if (current == G) {
    break;
    }
    int up = current + U; // 위로 올라가게 되면 현재층 + up 층
    int down = current - D; // 아래로 내려가게 되면 현재층 - down 층
    // 위로 올라갔을 때 top층 이하에 있고, up 층에 최초 방문이면
    if (up <= F && visited[up] == 0) {
    queue.offer(up); // 큐에 up층 집에 넣음
    visited[up] = visited[current] + 1; // up층에 누적 이동횟수 1증가시켜서 저장
    }
    // 내려갔을 때 1층 이상에 있고, down층에 최초 방문이면
    if (down >= 1 && visited[down] == 0) {
    queue.offer(down); // 큐에 down층 집에 넣음
    visited[down] = visited[current] + 1; // 방문배열의 down 인덱스에 현재 층 인덱스의 값에서 1을 더해 넣음(= 총 이동 횟수. 층 상관x)
    }
    }
    }

    처음 풀려고 시도한 날 : 23.04.07 공부한 날                 : 23.04.08

    처음 풀린 날    : 23.04.08 다시 풀어본 날 : 23.04.09

Designed by Tistory / Custom by 얼거스