PS/inflearn java coding

BFS 기본 예제

easy16 2022. 4. 12. 00:23

 

1. 기본 형태

- 아래의 경우 3가지 경우의 수를 나타내는 상태트리

- ch배열을 사용하는 이유? : 중복된 트리를 생성하면 성능상 손해가 크다. (대신 메모리를 점유)

- Q에서 현재값을 읽은 뒤, 계산된 값을 집어 넣는 것이 포인트.

class Main {

	static int n,m;
	int [] dis = {1, -1, 5};
	static int [] ch;//중복 방지용
	Queue<Integer> q = new LinkedList<>();
	//3가지 경우의 수, L은 최단거리를 의미함.
	public int  BFS ( int start, int end ) {
		//제약사항으로 주어짐
		ch = new int[10001]; 
		//초기 상태 저장.
		ch[start] = 1;
		q.offer(start);
		int L = 0;

		//q가 마를 때 까지 돌린다.
		while(!q.isEmpty()) {
			
			 int len = q.size();
			 for (int i = 0 ; i < len ; i ++) {
				 int pos = q.poll();
				 
				 //최종 거리에 도달했을 때, Level의 값이 최단거리가 된다.
				 if( pos == end) return L;
				 
				 //각 경우의 수에 대해 계산하여 q에 다시 저장.
				 for (int d : dis) {
					 int nx = pos+d;
					 if( nx>=1 && nx<=10000 && ch[nx] == 0) {
						 //핵심, 다음거리를 계산하여 다시 q에 넣어줌.
						 ch[nx] = 1;
						 q.offer(nx);
					 }
				 }
			 }			
			L++;
		}
		return L;
	}

	
	public static void main(String args[]) throws Exception {
		Main M = new Main();
		Scanner in = new Scanner(System.in);
		n = in.nextInt();
		m = in.nextInt();

		System.out.println( M.BFS(n, m) );
	}
}

 

 

 

//이진트리, 최단거리의 말단 노드 탐색


public int BFS( root ){
	Queue<Node> Q = new LinkedList<>();
    Q.offer(root);
    int L = 0;
    while( !Q.isEmpty()){
    	int len = Q.size();
        for ( int i = 0 ; i<len; ++i){
        	Node cur = Q.poll();
            if( cur.lt==null && cur.rt==null) return L; // 말단 노드 찾기
            if( cur.lt!=null) Q.offer(cur.lt);
            if( cur.rt!=null) Q.offer(cur.rt); // 레벨마다 2n승 증가.
            
        }
        L++;
    }
    return 0;
}