728x90
문제
https://www.acmicpc.net/problem/1697
3줄 요약
- 현재 위치에서 가능한 모든 이동 경우(앞으로, 뒤로, 두 배)들을 큐에 넣어 BFS를 통해 탐색합니다.
- 탐색 중에 동생의 위치(K)에 도달하면 걸린 시간을 출력하고 종료합니다.
- 이미 방문한 위치는 다시 방문하지 않도록 체크하여 무한 루프를 방지합니다.
코드
// package boj1697;
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
// System.setIn(new FileInputStream("src/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // 수빈이의 현재 위치
int K = Integer.parseInt(st.nextToken()); // 동생의 위치
// System.out.println(N + " " + K);
boolean[] visited = new boolean[100001]; // 방문 여부 배열
Queue<Integer[]> queue = new LinkedList<>(); // BFS를 위한 큐
Integer[] el = {N, 0}; // 시작 위치와 시간
queue.offer(el); // 큐에 시작 위치 추가
while (!queue.isEmpty()) {
el = queue.poll();
// System.out.println(el[0]);
if (el[0] == K) { // 동생의 위치에 도달한 경우
bw.write(el[1] + ""); // 걸린 시간 출력
break;
}
if (el[0] < 0 || el[0] >= 100001 || visited[el[0]]) {
continue; // 범위를 벗어나거나 이미 방문한 경우
}
visited[el[0]] = true; // 현재 위치 방문 처리
Integer[] tmp = {el[0] - 1, el[1] + 1}; // 한 칸 뒤로 이동
queue.offer(tmp);
Integer[] tmp2 = {el[0] + 1, el[1] + 1}; // 한 칸 앞으로 이동
queue.offer(tmp2);
Integer[] tmp3 = {el[0] * 2, el[1] + 1}; // 두 배로 이동
queue.offer(tmp3);
}
bw.flush();
br.close();
bw.close();
}
}
'Problem_Solving' 카테고리의 다른 글
백준(BOJ) 2644 : 촌수계산 (실버2) / 자바(Java) 풀이 (0) | 2024.05.19 |
---|---|
백준(BOJ) 2606 : 바이러스 (실버3) / 자바(Java) 풀이 (0) | 2024.05.18 |
백준(BOJ) 1260 : DFS와 BFS (실버2) / 자바(Java) 풀이 (0) | 2024.05.18 |
백준(BOJ) 14235 : 크리스마스 선물 (실버3) / 자바(Java) 풀이 (0) | 2024.05.16 |
백준(BOJ) 1417 : 국회의원 선거 (실버5) / 자바(Java) 풀이 (0) | 2024.05.16 |