알고리즘(BOJ)/Silver

16173 /16174 - 점프왕 쩰리(BFS)

ch.0 2022. 12. 22. 23:36


16173

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

//백준
public class Main {

	static int size;
	static int[][] array;

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

		Queue<int[]> q = new LinkedList<>();

		array = new int[size][size];

		for (int i = 0; i < size; i++) {
			for (int j = 0; j < size; j++) {
				array[i][j] = sc.nextInt();
			}
		}

		int x = 0;
		int y = 0;
		String result = "Hing";

		q.offer(new int[] { 0, 0 });


			while (!q.isEmpty()) {
				int[] point = q.poll();
				x = point[0];
				y = point[1];
				int add = array[x][y];
				// System.out.println("x: "+x+"y: "+y+"add: "+add);

				if(add==0) {
					//q.poll();
				}
				else if (add == -1) {
					result = "HaruHaru";
					break;
				} else {
					if (x + add < size) {
						q.offer(new int[] { x + add, y });
					}
					if (y + add < size) {
						q.offer(new int[] { x, y + add });
					}

				}

			}
		
		System.out.println(result);



	}

}

KeyPoint: 좌표를 가지고 있어야 하는데 어떻게 가지고 있을지. (이동하고나서 그 이동한 위치에서 출발해야 하기 때문)

큐를 배열로 선언하고 new int[] {0.0} 이렇게 담아주고 꺼내서 썼다.

 

실수한점: 방문여부를 따지지 않았으므로 갔던곳을 또 방문하게 된다 아래의 Large에서 메모리 문제 발생

 

 

 

16174

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

//백준
public class Main {


	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int size = Integer.parseInt(br.readLine());
		
		StringTokenizer st;
		//StringBuilder sb = new StringBuilder();

		Queue<int[]> q = new LinkedList<>();

		int[][] array = new int[size][size];
		boolean[][] visited = new boolean[size][size];

		for (int i = 0; i < size; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int j = 0; j < size; j++) {
				
				array[i][j] = Integer.parseInt(st.nextToken());
			}
		}


		String result = "Hing";

		q.offer(new int[] { 0, 0 });
		visited[0][0] = true;


			while (!q.isEmpty()) {
				int[] point = q.poll();
				int x = point[0];
				int y = point[1];
				int add = array[x][y];

				// System.out.println("x: "+x+"y: "+y+"add: "+add);

				if(add==0) {
					//q.poll();
				}
				else if (add == -1) {
					result = "HaruHaru";
					break;
				} else {
					if (x + add < size &&visited[x+add][y]==false) {
						q.offer(new int[] { x + add, y });
						visited[x+add][y]=true;
						
					}
					if (y + add < size&&visited[x][y+add]==false) {
						q.offer(new int[] { x, y + add });
						visited[x][y+add]=true;
					}

				}

			}
		
		System.out.println(result);



	}

}

KeyPoint : befferedReader로 바꾸니까 더 진행은 되었지만 결국 방문여부를 따지지 않아 메모리초과가 되었다.

BFS로 풀때에는 방문여부는 필수로 하자.