PS/BOJ2022. 5. 2. 14:57

스타트링크 : https://www.acmicpc.net/problem/5014

 

 

 

DFS : 35%에서 멈춤 -> 입력을 1000000으로 했을 때, java.lang.StackOverflowError 발생하는 것으로 보아,

채점 시에도 해당 문제가 발생했을거라 생각됨.

 

시 입력의 범위가 100만 단위가 넘어가면 dfs는 비효율적인 것 같다.

참조 : https://loosie.tistory.com/213

 

 

 

 

DFS : java.lang.StackOverflowError 

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

public class Main {

	static int F, S, G, U, D;
	static boolean[] visited;
	static long answer = Integer.MAX_VALUE;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		F = Integer.parseInt(st.nextToken());
		S = Integer.parseInt(st.nextToken());
		G = Integer.parseInt(st.nextToken());
		U = Integer.parseInt(st.nextToken());
		D = Integer.parseInt(st.nextToken());

		visited = new boolean[F + 1];
		visited[S] = true;
		dfs(S, 0);
		if( answer == Integer.MAX_VALUE)
			System.out.println("use the stairs");
		else
			System.out.println(answer);
	}

	private static void dfs(int now, int count) {
		int[] dy = { U, -D };
		if (now > F || now <= 0) {
			return;
		}
		if (now == G) {
			answer = Math.min(answer, count);			
			return;
		}

		for (int i = 0; i < 2; i++) {
			int newFlow = now + dy[i];
			if ( newFlow >= 1 && newFlow <= F && !visited[newFlow]) {
				visited[newFlow]=true;
				dfs(newFlow, count+1);
			}
		}

		return;
	}

}

 

BFS

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 {

	static int F, S, G, U, D;
	static boolean[] visited;
	static long answer = Integer.MAX_VALUE;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		F = Integer.parseInt(st.nextToken());
		S = Integer.parseInt(st.nextToken());
		G = Integer.parseInt(st.nextToken());
		U = Integer.parseInt(st.nextToken());
		D = Integer.parseInt(st.nextToken());


		answer = bfs();
		if (answer == -1)
			System.out.println("use the stairs");
		else
			System.out.println(answer);
	}

	private static int bfs() {

		Queue<Integer> Q = new LinkedList<>();
		int[] d = { U, -D };
		int level = 0;
		visited = new boolean[F + 1];
		visited[S] = true;
		Q.offer(S);
		
		
		while (!Q.isEmpty()) {
			int size = Q.size();
			for (int q = 0; q < size; ++q) {
				int now = Q.poll();

				if (now == G)
					return level;

				for (int i = 0; i < 2; i++) {
					int next = now + d[i];
					if (next < 1 || next > F) {
						continue;
					}

					if (!visited[next]) {
						visited[next] = true;
						Q.offer(next);
					}
				}

			}
			level++;
		}

		return -1;
	}

}

'PS > BOJ' 카테고리의 다른 글

2580  (0) 2022.05.03
1759  (0) 2022.05.02
3108  (0) 2022.05.02
2186(중요)  (0) 2022.05.01
2251  (0) 2022.05.01
Posted by easy16