반응형
문제
https://www.acmicpc.net/problem/1697

코드
import java.io.*;
import java.util.*;
public class bj_1697 {
private static Queue<Integer> queue = new LinkedList<>();
private static boolean[] visited = new boolean[100001];
private static int K;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
int result = bfs(N);
System.out.println(result);
}
private static int bfs(int v) {
queue.add(v);
visited[v] = true;
int time = 0;
while (!queue.isEmpty()) {
int size = queue.size();
for (int s = 0; s < size; s++) {
int current = queue.poll();
if (current == K) {
return time;
}
int[] dx = {current - 1, current + 1, current * 2};
for (int nx : dx) {
if (nx >= 0 && nx <= 100000 && !visited[nx]) {
visited[nx] = true;
queue.add(nx);
}
}
}
time++;
}
return time;
}
}
풀이
queue.add(v);
visited[v] = true;
int time = 0;
- 큐에 초기값(`N`)을 삽입
- `visitied[v] = true` → 시작 위치를 방문 체크
- `time`: 경과 시간을 저장할 변수
int current = queue.poll();
if (current == K) {
return time;
}
- 현재 큐에 있는 위치(`current`)를 가져옴
- 동생 위치(`K`)에 도달하면 `time` 반환
int[] dx = {current - 1, current + 1, current * 2};
for (int nx : dx) {
if (nx >= 0 && nx <= 100000 && !visited[nx]) {
visited[nx] = true;
queue.add(nx);
}
}
- 이동 가능한 3가지 경우
- `current - 1` (뒤로 한 칸)
- `current + 1` (앞으로 한 칸)
- `current * 2` (순간이동)
- `if (nx >= 0 && nx <= 100000 && !visited[nx])`
- 범위를 벗어나지 않고, 방문하지 않은 곳이면 큐에 추가
이제 BFS도 좀 익숙해져가는 듯하다... 처음에 문제를 보고 이걸 어떻게 풀어했는데 차근차근해보니깐 성공~~
반응형
'백준' 카테고리의 다른 글
[백준] 7662: 이중 우선순위 큐 (0) | 2025.03.25 |
---|---|
[백준] 7662: 이중 우선순위 큐 (0) | 2025.03.22 |
[백준] 11279: 최대 힙 (0) | 2025.03.20 |
[백준] 1167: 트리의 지름 (0) | 2025.03.19 |
[백준] 2178: 미로 탐색 (0) | 2025.03.15 |
반응형
문제
https://www.acmicpc.net/problem/1697

코드
import java.io.*;
import java.util.*;
public class bj_1697 {
private static Queue<Integer> queue = new LinkedList<>();
private static boolean[] visited = new boolean[100001];
private static int K;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
int result = bfs(N);
System.out.println(result);
}
private static int bfs(int v) {
queue.add(v);
visited[v] = true;
int time = 0;
while (!queue.isEmpty()) {
int size = queue.size();
for (int s = 0; s < size; s++) {
int current = queue.poll();
if (current == K) {
return time;
}
int[] dx = {current - 1, current + 1, current * 2};
for (int nx : dx) {
if (nx >= 0 && nx <= 100000 && !visited[nx]) {
visited[nx] = true;
queue.add(nx);
}
}
}
time++;
}
return time;
}
}
풀이
queue.add(v);
visited[v] = true;
int time = 0;
- 큐에 초기값(
N
)을 삽입 visitied[v] = true
→ 시작 위치를 방문 체크time
: 경과 시간을 저장할 변수
int current = queue.poll();
if (current == K) {
return time;
}
- 현재 큐에 있는 위치(
current
)를 가져옴 - 동생 위치(
K
)에 도달하면time
반환
int[] dx = {current - 1, current + 1, current * 2};
for (int nx : dx) {
if (nx >= 0 && nx <= 100000 && !visited[nx]) {
visited[nx] = true;
queue.add(nx);
}
}
- 이동 가능한 3가지 경우
current - 1
(뒤로 한 칸)current + 1
(앞으로 한 칸)current * 2
(순간이동)
if (nx >= 0 && nx <= 100000 && !visited[nx])
- 범위를 벗어나지 않고, 방문하지 않은 곳이면 큐에 추가
이제 BFS도 좀 익숙해져가는 듯하다... 처음에 문제를 보고 이걸 어떻게 풀어했는데 차근차근해보니깐 성공~~
반응형
'백준' 카테고리의 다른 글
[백준] 7662: 이중 우선순위 큐 (0) | 2025.03.25 |
---|---|
[백준] 7662: 이중 우선순위 큐 (0) | 2025.03.22 |
[백준] 11279: 최대 힙 (0) | 2025.03.20 |
[백준] 1167: 트리의 지름 (0) | 2025.03.19 |
[백준] 2178: 미로 탐색 (0) | 2025.03.15 |