알고리즘/문제 풀이

[Java/자바 백준 16928] 뱀과 사다리 게임

광규니 2022. 3. 27. 16:41
반응형

풀이

우선 최솟값을 위해 BFS를 사용했습니다.

 

1차원 배열을 길이가 100으로 선언하고 0으로 초기화 해줍니다.

해당 인덱스에 사다리나 뱀이 있다면 이동하게되는 위치를 넣어주고

0에서부터 큐에 삽입하여 게임을 시작합시다 !

 

1~6에 주사위에 따라 전진하면서

해당값을 방문했는지, 범위에 벗어나지 않는지, 배열에 사다리, 뱀이 있는지 판단해주며

 

100에 도달시 (배열이라 인덱스는 99입니다)  걸린 시간을 출력해주면 되는 문제 입니다 !

import java.io.*;
import java.util.*;

public class Main{
	static int[] map;
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		map = new int[100];
		
		//사다리 
		int N = Integer.parseInt(st.nextToken());
		//뱀 
		int M = Integer.parseInt(st.nextToken());
		for(int i = 0 ; i < N ; i++) {
			st = new StringTokenizer(br.readLine());
			int start = Integer.parseInt(st.nextToken());
			int end = Integer.parseInt(st.nextToken());
			
			map[start - 1] = end - 1;
		}
		
		for(int i = 0 ; i < M ; i++) {
			st = new StringTokenizer(br.readLine());
			int start = Integer.parseInt(st.nextToken());
			int end = Integer.parseInt(st.nextToken());
			
			map[start - 1] = end - 1;
		}
		
		bfs();
		
	}
	private static void bfs() {
		Queue<Integer> queue = new LinkedList<Integer>();
		boolean[] visited = new boolean[100];
		
		queue.offer(0);
		visited[0] = true;
		int time = 0;
		while(! queue.isEmpty()) {
			time ++;
			int size = queue.size();
			for(int i = 0 ; i < size ; i++) {				
				int cur = queue.poll();
				for(int plus = 1 ; plus <= 6 ; plus ++) {
					int nx = cur + plus;
					
					if(0 > nx || nx > 99 || visited[nx]) continue;
					// 목적지 도착 할때 
					if(nx == 99) {
						queue.clear();
						System.out.println(time);
						return;
					}
					// 사다리나 뱀이 없을때 
					if(map[nx] == 0) {						
						queue.add(nx);
						visited[nx] = true;
						
					}
					// 사다리나 뱀이 있을때 방문한 값이 아니라면 큐에 삽입  
					else {
						if(visited[map[nx]]) continue;
						queue.add(map[nx]);
						visited[map[nx]] = true;
						
					} 	
				}
			}
		}
	}
}
반응형