배푸니까

[백준 / JAVA] 13549. 숨바꼭질3 본문

백준

[백준 / JAVA] 13549. 숨바꼭질3

baefrica 2023. 9. 3. 20:41
반응형

https://www.acmicpc.net/problem/13549

 

13549번: 숨바꼭질 3

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때

www.acmicpc.net

 


💻 풀이 결과

💯 최종 코드

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

class Node {
	int num, cnt;

	Node(int num, int cnt) {
		this.num = num;
		this.cnt = cnt;
	}
}

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int N = sc.nextInt();
		int K = sc.nextInt();

		Queue<Node> queue = new LinkedList<>();
		boolean[] visited = new boolean[100001];

		queue.add(new Node(N, 0));
		visited[N] = true;
		int next;

		while (!queue.isEmpty()) {
			Node curr = queue.poll();

			// 동생을 찾았다.
			if (curr.num == K) {
				System.out.println(curr.cnt);
				break;
			}

			// 0초 후 순간이동
			next = curr.num * 2;
			if (next >= 0 && next < 100001 && !visited[next]) { // next 범위 체크 중요!!
				queue.add(new Node(next, curr.cnt));
				visited[next] = true;
			}

			// 1초 후 걷기이동
			next = curr.num - 1;
			if (next >= 0 && next < 100001 && !visited[next]) {
				queue.add(new Node(next, curr.cnt + 1));
				visited[next] = true;
			}
			next = curr.num + 1;
			if (next >= 0 && next < 100001 && !visited[next]) {
				queue.add(new Node(next, curr.cnt + 1));
				visited[next] = true;
			}
		}
	}
}

💬 풀이 과정

  • 순간이동 시에는 curr.cnt를 증가시키지 않는다.
  • 걷기 이동 시에는 curr.cnt를 증가시킨다.
  • visited 배열을 통해 방문 검사를 하고 BFS를 돌리면서 방문체크를 꼭 해준다.
  • 1697. 숨바꼭질 문제와 동일하게 풀었다.

💡 깨달은 점

1. 방문 검사와 방문 체크 잘하기!

  • 방문하지 않은 것만 BFS를 돌리고 BFS가 돌면 방문 체크를 꼭 해주어야 한다.
반응형

'백준' 카테고리의 다른 글

[백준 / JAVA] 1629. 곱셈  (0) 2023.10.22
[백준 / JAVA] 2146. 다리 만들기  (0) 2023.10.16
[백준 / JAVA] 2573. 빙산  (0) 2023.08.31
[백준 / JAVA] 2206. 벽 부수고 이동하기  (0) 2023.08.30
[백준 / JAVA] 6593. 상범 빌딩  (0) 2023.08.22