본문 바로가기

연습문제/JAVA

1620-DFS와 BFS

 

 

1260번: DFS와 BFS

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

www.acmicpc.net

package com.exam;

import java.util.*;

public class B1260 {
    static int N,L,S;
    static int[][] Board;
    static boolean[] visited;
    static ArrayList<Integer> compare;

    public static void bfs(){
        Queue<Integer> queue = new LinkedList<>();
        visited = new boolean[N];
        visited[S-1] = true;
        queue.add(S);

        while(!queue.isEmpty()){
            compare = new ArrayList<>();
            int curr = queue.remove();
            System.out.print(curr+" ");

            for(int i=0; i<L; i++){
                for(int j=0; j<2; j++){
                    if(Board[i][j]==curr){
                        if(j==0) compare.add(Board[i][j+1]);
                        if(j==1) compare.add(Board[i][j-1]);
                    }
                }
            }
            if(compare.size()==1){
                if(visited[compare.get(0)-1]) continue;
                visited[compare.get(0)-1] = true;
                queue.add(compare.get(0));
            }
            if(compare.size()>1){
                Collections.sort(compare);
                for(int node : compare){
                    if(visited[node-1]) continue;
                    visited[node-1] = true;
                    queue.add(node);
                }
            }
        }
    }

    public static void dfs(int node){
        visited[node-1] = true;
        compare = new ArrayList<>();
        System.out.print(node+" ");
        for(int i=0; i<L; i++){
            for(int j=0; j<2; j++){
                if(Board[i][j]==node){
                    if(j==0&& !visited[Board[i][j+1]-1]) compare.add(Board[i][j+1]);
                    if(j==1&& !visited[Board[i][j-1]-1]) compare.add(Board[i][j-1]);
                }
            }
        }
        Collections.sort(compare);
        for(int i : compare){
            if(visited[i-1]) continue;
            dfs(i);
        }
    }

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

        N = sc.nextInt();
        L = sc.nextInt();
        S = sc.nextInt();

        Board = new int[L][2];

        for(int i=0; i<L; i++){
            for(int j=0; j<2; j++){
                Board[i][j] = sc.nextInt();
            }
        }
        visited = new boolean[N];
        dfs(S);
        System.out.println();
        bfs();
    }
}

간단한 문제인거 같은데 코드가 다른 사람들에 비해 코드가 너무 길게나왔다

다시한번 풀어봐야겠다

'연습문제 > JAVA' 카테고리의 다른 글

10451-순열사이클  (0) 2022.08.08
2178-미로탐색  (0) 2022.08.07
16234-인구이동  (0) 2022.08.05
16234-인구이동 (오답)  (0) 2022.08.04
Java- Example6번 ( p506~507 )  (0) 2021.08.13