
-Code
import java.util.*;
import java.io.*;
public class BOJ1697 {
static boolean[] visited = new boolean[100001];
static int[] moveTime = new int[100001];
public static void main(String[] args) throws Exception{
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int subinPos = Integer.parseInt(st.nextToken());
int sisterPos = Integer.parseInt(st.nextToken());
// dfs로 최소값 구하기
bfs(subinPos, sisterPos);
// 출력
System.out.println(moveTime[sisterPos]);
}
private static void bfs(int pos, int targetPos) {
// 방문 확인
visited[pos] = true;
// 덱에 처음 시작 위치 저장
Deque<Integer> deque = new ArrayDeque<>();
deque.addLast(pos);
// 덱을 돌면서 확인
while (!deque.isEmpty()) {
// 현재 포지션 추출
int nowPos = deque.pollFirst();
// 가려하는 위치 도착하면 탈출
if (nowPos == targetPos) {
return;
}
// 다음 포지션들 검사
int[] nextPositions = {nowPos + 1, nowPos - 1, nowPos * 2};
for (int i = 0; i < 3; i++) {
int nextPos = nextPositions[i];
// 범위 안이고 방문하지 않았으면 검사
if (0 <= nextPos && nextPos < 100001 && !visited[nextPos]) {
visited[nextPos] = true;
moveTime[nextPos] = moveTime[nowPos] + 1;
deque.addLast(nextPos);
}
}
}
}
}
이전에 풀었던 bfs, dfs 문제들과 비슷하게 생각해 visited를 안 만들고 하다가 접근을 잘못했습니다. visited를 적용하고 따로 움직인 시간을 저장할 배열이 하나 더 필요해서 해당 부분도 따로 선언해 이전 값에 + 1 한 값을 저장하도록 하여 해결했습니다.
'Beakjoon&프로그래머스 > Java' 카테고리의 다른 글
| [백준/Java] 7576번 토마토 (1) | 2026.01.03 |
|---|---|
| [백준/Java] 7562번 나이트의 이동 (0) | 2026.01.03 |
| [백준/Java] 1012번 유기농 배추 (0) | 2026.01.03 |
| [프로그래머스/Java] 프로세스 (0) | 2026.01.03 |
| [프로그래머스/Java] 전화번호 목록 (0) | 2026.01.03 |