Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
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
Archives
Today
Total
관리 메뉴

Life Engineering

[BOJ 16928] 뱀과 사다리 게임 (Java) 본문

Problem Solving

[BOJ 16928] 뱀과 사다리 게임 (Java)

흑개 2022. 3. 20. 00:33

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

 

16928번: 뱀과 사다리 게임

첫째 줄에 게임판에 있는 사다리의 수 N(1 ≤ N ≤ 15)과 뱀의 수 M(1 ≤ M ≤ 15)이 주어진다. 둘째 줄부터 N개의 줄에는 사다리의 정보를 의미하는 x, y (x < y)가 주어진다. x번 칸에 도착하면, y번 칸으

www.acmicpc.net

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main_BOJ_16928 {
	static int N, M;
	static int answer=Integer.MAX_VALUE;
	static int[] marks=new int[101];
	static boolean[] check;
	static Map<Integer, Integer> ladders=new HashMap<>();
	static Map<Integer, Integer> snakes=new HashMap<>();
	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());
		M=Integer.parseInt(st.nextToken());
		for (int i=0; i<N; i++) {
			 st=new StringTokenizer(br.readLine());
			 int x=Integer.parseInt(st.nextToken());
			 int y=Integer.parseInt(st.nextToken());
			 marks[x]=1;
			 ladders.put(x, y);
		}
		for (int i=0; i<M; i++) {
			 st=new StringTokenizer(br.readLine());
			 int x=Integer.parseInt(st.nextToken());
			 int y=Integer.parseInt(st.nextToken());
			 marks[x]=2;
			 snakes.put(x, y);
		}
		bfs();
		System.out.println(answer);

	}
	private static void bfs() {
		check=new boolean[101];
		Queue<int[]> q=new LinkedList<>();
		q.add(new int[] {1, 0});
		check[1]=true;
		while (!q.isEmpty()) {
			int x=q.peek()[0];
			int dist=q.peek()[1];
			q.poll();
			for (int d=1; d<=6; d++) {
				int nx=x+d;
				if (nx>=1 && nx<=100 && !check[nx]) {
					if (nx==100) {
						answer=Math.min(answer, dist+1);
						return;
					}
					check[nx]=true;
					if (marks[nx]==1) {
						int dest=ladders.get(nx);
						check[dest]=true;
						q.add(new int[] {dest, dist+1});
					}
					else if (marks[nx]==2) {
						int dest=snakes.get(nx);
						check[dest]=true;
						q.add(new int[] {dest, dist+1});
					}
					else {
						q.add(new int[] {nx, dist+1});
					}
				}
			}
		}
	}

}

전형적인 bfs 문제.. 이나.. 다른 분들의 효율성 좋은 코드에서 많이 배워간다.(https://100100e.tistory.com/194)

 

백준(BOJ) 16928번 뱀과 사다리 게임

문제 : https://www.acmicpc.net/problem/16928 v)가 주어진다. u번 칸에 도착하면, v번 칸으로 이동한다는 의미이다. 1번 칸과 100번 칸은 뱀과 사다리의 시작 또는 끝이 아니다. 모든 칸" data-og-host="www.acm..

100100e.tistory.com

이 분의 코드도 BFS를 이용했으나, los 배열에 사다리와 뱀의 위치를 표시해준다. 인덱스가 시작 위치가 되고, 인덱스에 대한 값이 종료 위치가 된다.

쭉 BFS 탐색을 하면서, nx 노드가 뱀이나 사다리의 시작 위치라면(los[nx]!=0), 종료 위치로 그 값을 바꿔준다.

또한 큐에서 dist 값을 따로 가지고 다닐 필요가 없이, dist 배열을 이용하여 방문 여부와 그 위치까지 도달하는데 필요한 시간을 모두 저장할 수 있다. dist[nx]=dist[x]+1 가 되고, 미방문 역시 dist배열이 -1 일 때로 간주해주면 된다. 

'Problem Solving' 카테고리의 다른 글

[BOJ 1967] 트리의 지름 (Java)  (0) 2022.03.22
[BOJ 18111] 마인크래프트 (Java)  (0) 2022.03.22
[BOJ 2565] 전깃줄 (Java)  (0) 2022.03.17
[BOJ 2638] 치즈 (Java)  (0) 2022.03.17
[프로그래머스] 이중 우선순위 큐 (Java)  (0) 2022.03.17