티스토리 뷰

코딩 테스트

bfs 자바

상어악어 2023. 4. 5. 13:07
반응형

bfs의 원리

 

1. 시작노드를 큐에 넣고 방문했다는 표시를 함

2. 큐에서 원소를 하나 빼고, 인접한 노드들에 대해 3번을 진행함

3. 방문했으면 아무것도 하지 않고, 방문하지 않았으면 원소를 큐에 넣고 방문했다는 표시를 함

4. 큐에 원소가 빌때까지 2번을 반복함

모든 칸이 큐에 1번씩 들어가므로 시간복잡도는 칸이 N개일 때 O(N)

 

참고 블로그: https://blog.encrypted.gg/941

 

[실전 알고리즘] 0x09강 - BFS

안녕하세요 여러분, 드디어 올 것이 왔습니다. 마음의 준비를 단단히 하셔야 합니다.. 드디어 실전 알고리즘 강의에서 첫 번째 고비에 도달했는데 이 강의와 함께 이번 고비를 잘 헤쳐나가면 좋

blog.encrypted.gg

 

 

 

1260번을 한 번 풀어보겠다

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

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

 

 

전체 코드

package com.example.demo.Week1;

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

class Main{
    static StringBuilder sb=new StringBuilder();
    static Queue<Integer> q=new LinkedList<>();
    static int[] visited;
    static int node, line, start;
    static int[][] arr;


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

        visited=new int[node+1];
        arr=new int[node+1][node+1];

        for(int i=0; i<line; i++){
            StringTokenizer str=new StringTokenizer(br.readLine());
            int a=Integer.parseInt(str.nextToken());
            int b=Integer.parseInt(str.nextToken());

            arr[a][b]=1;
            arr[b][a]=1;
        }
        bfs(start);

        System.out.println(sb);

    }

    static void bfs(int start){
        q.add(start);
        visited[start]=1;

        while(!q.isEmpty()){
            start=q.poll();
            sb.append(start+" ");

            for(int i=1; i<=node; i++){
                if(visited[i]!=1 && arr[start][i]==1){
                    q.add(i);
                    visited[i]=1;
                }
            }

        }

    }

}

 

1. 시작노드를 큐에 넣고 방문했다는 표시를 함

q.add(start);

visited[start]=1;

 

2. 큐에서 원소를 하나 빼고 인접한 노드들에대해 3번진행

start=q.poll();

sb.append(start+" ");

 

 

3. 방문했으면 아무것도 하지 않고, 방문하지 않았으면 큐에 원소를 넣어주고 방문했다는 표시를 한다

for(int i=1; i<=node; i++){

if(visited[i]!=1 && arr[start][i]==1){

q.add(i);

q.visited[i]=1;

}

}

 

arr는

노드와 노드사이의 간선을 표시하는 2차원 배열이다

arr[start][i]가 1이면 간선이 존재한다는 것이다

간선이 존재하고 방문하지 않았을때만 큐에 넣어준 

 

 

4. 큐가 빌때까지 반복

while(!q.isEmpty())

{

 

}로 감쌈

 

 

참고 블로그 : https://infodon.tistory.com/96

 

[백준알고리즘-JAVA]1260번 풀이(DFS와 BFS) - 초보도 이해하는 풀이

안녕하세요 인포돈 입니다. 백준 알고리즘 1260번 풀이입니다. * 참고사항 - 개발환경은 eclipse을 기준으로 작성되었습니다. - java언어를 이용하여 문제를 풀이합니다. - 알고리즘 문제는 풀이를 보

infodon.tistory.com

 

반응형

'코딩 테스트' 카테고리의 다른 글

java 헷갈리는 문법  (0) 2023.04.17
파이썬 문법 - 2  (0) 2022.12.28
파이썬 문법  (0) 2022.12.28
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함