알고리즘

[백준][Java] 숨바꼭질 3

five2week 2023. 5. 31. 20:44

문제링크

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