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(너비 우선 탐색)로 푼 이유는 다음과 같습니다:
1. 최소 이동 횟수 찾기
BFS는 최단 경로 문제에서 최소 이동 횟수를 찾는 데 적합한 알고리즘입니다.
각 단계에서 가능한 모든 층을 방문하며, 최소 버튼 클릭 횟수를 찾습니다.
이 문제의 경우, U와 D 버튼을 사용하여 엘리베이터가 도달할 수 있는 층을 찾아야 하며, BFS는 이러한 목적에 적합합니다.
2. 방문한 층 추적
BFS를 사용하면 각 단계에서 방문한 층을 쉽게 추적할 수 있습니다.
visited 배열을 사용하여 각 층의 방문 여부를 기록하고, 이를 통해 중복 방문을 방지할 수 있습니다.
이는 문제의 효율성을 높이고, 필요한 최소 클릭 횟수를 찾는 데 도움이 됩니다.
3. 구현의 간결성
BFS를 사용하면 구현이 상대적으로 간결하고 이해하기 쉽습니다.
각 단계에서 가능한 모든 층을 방문하며, 도달할 수 없는 층이 있는지 확인하는 과정을 반복합니다.
이는 코드를 작성하고 디버깅하는 데 도움이 됩니다.
🤓📝
// 전역 변수 선언
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]);
}
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