티스토리 뷰
문제링크
https://www.acmicpc.net/problem/13549
13549번: 숨바꼭질 3
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
# 문제 풀이
수빈이가 할 수 있는 이동은 크게 두가지가 있습니다. 걷기와 순간이동입니다. 둘은 각각 아래와 같습니다.
걷기 -> 1초, x+1 or x-1
순간이동 -> 0초, 2x
수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구해야합니다.
저는 탐색 조건을 아래와 같이 정했습니다.
1. 이동했을 때, 수빈이의 위치가 정해진 범위를 벗어나지 않는지 검사
2. 첫 방문이라면 몇초에 방문했는지 입력하고, 큐에 넣기
3. 이전에 왔다면, 그전의 방문보다 이르게 도착하는 경로인 경우, 저장하고 큐에 넣기
제가 정한 탐색 조건에 따라 수빈이가 할 수 있는 이동의 종류를 bfs로 구현하였습니다.
# 문제 코드
public class Main {
static int n, k;
static int[] visited = new int[100001];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
bfs();
System.out.println(visited[k]);
}
public static void bfs() {
Queue<Node> q = new LinkedList<Node>();
q.add(new Node(n, 0));
Arrays.fill(visited, -1);
visited[n] = 0;
while (!q.isEmpty()) {
Node node = q.poll();
if (node.x - 1 >= 0 && (visited[node.x - 1] > node.count + 1 || visited[node.x - 1] == -1)) {
visited[node.x - 1] = node.count + 1;
q.add(new Node(node.x - 1, node.count + 1));
}
if (node.x + 1 <= 100000 && (visited[node.x + 1] > node.count + 1 || visited[node.x + 1] == -1)) {
visited[node.x + 1] = node.count + 1;
q.add(new Node(node.x + 1, node.count + 1));
}
if (2 * node.x <= 100000 && (visited[2 * node.x] > node.count || visited[2 * node.x] == -1)) {
visited[2 * node.x] = node.count;
q.add(new Node(2 * node.x, node.count));
}
}
}
public static class Node {
int x, count;
public Node(int x, int count) {
super();
this.x = x;
this.count = count;
}
}
}
'알고리즘' 카테고리의 다른 글
| [SWEA][Java] 탈주범 검거 (0) | 2023.05.25 |
|---|---|
| [SWEA][Java] 보급로 (0) | 2023.05.23 |
| [SWEA][Java] 수영장 (0) | 2023.05.22 |
| [SWEA][Java] 프로세서 연결하기 (0) | 2023.05.21 |
| [java][백준 11066] 파일 합치기 (0) | 2023.04.01 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- compose
- java
- @provides
- 알고리즘
- api 경로
- SSAFY
- Kotlin
- newtoken
- retrofit
- Android
- 상단알람
- okhttp
- SWEA
- 데이터무결성체크
- 모바일트랙
- this
- hilt
- build type
- 디버그 빌드
- tomap
- missingbinding
- 릴리즈 빌드
- connecttimeout
- 빌드 타입
- 안드로이드
- 코틀린
- 백준
- 싸피
- release build
- 블루투스개념정리
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함