본문 바로가기

Algorithm/DFS,BFS

DFS/BFS 다시풀기(JAVA)

  1. 연결요소의 개수

  2. 촌수계산

  3. 나이트의 이동

  4. 유기농배추

  5. 토마토

  6. 상범빌딩

  7. 적록색약

  8. 안전영역

  9. 스타트링크

  10. 숨바꼭질

 

 

1. 연결요소의 개수

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import java.util.Scanner;
 
public class Main {
    private static ArrayList[] edge;
    private static boolean[] visited;
 
    static void dfs(int x){
        visited[x] = true;
 
        for(int i=0; i<edge[x].size();++i){
            int next = (int) edge[x].get(i);
            if(!visited[next]){
                dfs(next);
            }
        }
    }
 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(); //노드의 수
        int m = scanner.nextInt(); // 전체 edge의 수
 
        visited = new boolean[n+1];
        edge = new ArrayList[n+1];
        for(int i=0;i<n+1;++i){
            edge[i] = new ArrayList<Integer>();
        }
 
        int from, to;
        for(int i=0;i<m;++i){
            from = scanner.nextInt();
            to = scanner.nextInt();
 
            edge[from].add(to);
            edge[to].add(from);
        }
 
        int cnt = 0;
        for(int i=1;i<=n;++i){
            if(!visited[i]){
                dfs(i);
                cnt++;
            }
        }
        System.out.println(cnt);
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
1

 

2. 촌수 계산

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 
public class Main{
    private static boolean[][] edge =new boolean[102][102];
    private static int[] visited = new int[102];
    private static int x;
    private static int y;
    private static int n;
 
 
    static void bfs(){
        Queue<Integer> queue = new LinkedList<>();
        queue.add(x);
        visited[x]++;
 
        while (!queue.isEmpty()){
            int cur = queue.peek();
            queue.remove();
 
            for(int i=1;i<=n;++i){
                if(visited[i]==0 && edge[cur][i]){
                    visited[i] = visited[cur]+1;
 
                    if(visited[y]!=0return;
 
                    queue.add(i);
                }
            }
        }
    }
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str;
 
        n = Integer.parseInt(br.readLine());
 
        str = br.readLine().split(" ");
        x = Integer.parseInt(str[0]);
        y  = Integer.parseInt(str[1]);
        int e = Integer.parseInt(br.readLine());
 
        int from, to;
        for(int i=0;i<e;++i){
            str = br.readLine().split(" ");
            from = Integer.parseInt(str[0]);
            to = Integer.parseInt(str[1]);
 
            edge[from][to] = true;
            edge[to][from] = true;
        }
 
        bfs();
 
        if(visited[y]==0){
            System.out.println(-1);
        }else{
            System.out.println(visited[y]-1);
        }
 
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

왜 bfs가 더 좋은지? 잘 생각해보자

 

3. 나이트의 이동

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 
public class Main {
    static private int length;
 
    static private int[] dx = {-2-11221-1-2};
    static private int[] dy = {1221-1-2-2-1};
 
    static private int[][] visited = new int[301][301];
 
    static class Pair{
        public int x;
        public int y;
 
        public Pair(int y, int x) {
            this.x = x;
            this.y = y;
        }
    }
 
    static boolean isRangeOver(Pair p){
        return p.x<0 || p.y<0 || p.x>=length || p.y>=lengthtruefalse;
    }
 
    static void bfs(int startY, int startX, int destY, int destX){
        Queue<Pair> queue = new LinkedList<>();
        queue.add(new Pair(startY, startX));
        visited[startY][startX] = 1;
 
        while(!queue.isEmpty()){
            Pair cur = queue.peek();
            queue.remove();
 
            for(int i=0;i<dx.length;++i){
                Pair next = new Pair(cur.y + dy[i], cur.x + dx[i]);
                if(!isRangeOver(next) && visited[next.y][next.x]==0){
                    visited[next.y][next.x] = visited[cur.y][cur.x] + 1;
                    if(next.y == destY && next.x == destX) return;
 
                    queue.add(next);
                }
            }
        }
    }
 
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str;
 
        int tc = Integer.parseInt(br.readLine());
 
        while(tc!=0){
            length = Integer.parseInt(br.readLine());
 
            str = br.readLine().split(" ");
            int curY = Integer.parseInt(str[0]);
            int curX = Integer.parseInt(str[1]);
 
            str = br.readLine().split(" ");
            int destY = Integer.parseInt(str[0]);
            int destX = Integer.parseInt(str[1]);
 
            bfs(curY, curX, destY, destX);
            System.out.println(visited[destY][destX]-1);
 
            visited = new int[301][301]; //초기화하는 방법으로 바꾸기
            tc--;
        }
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

visited[]의 사용방법 잘 보기

테스트 케이스 처리방법 잘 보기

 

4. 유기농 배추

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
 
public class Main {
 
    static private int M; // 가로
    static private int N; // 세로
 
    static private boolean map[][] = new boolean[51][51];
    static private boolean visited[][] = new boolean[51][51];
 
    static private int[] dx = {0,-1,0,1};
    static private int[] dy = {-1,0,1,0};
 
    static class Pair{
        int x;
        int y;
 
        public Pair(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
 
    static boolean isRangeOver(Pair pair){
        return pair.y<0||pair.x<0||pair.y>=N||pair.x>=M?true:false;
    }
 
    static void bfs(int startX, int startY){
        Queue<Pair> queue = new LinkedList<>();
 
        Pair pair = new Pair(startX, startY);
        visited[startX][startY] = true;
 
        queue.add(pair);
 
        while (!queue.isEmpty()){
            Pair cur = queue.peek();
            queue.remove();
 
            for(int i=0;i<dx.length;++i){
                int nextX = cur.x + dx[i];
                int nextY = cur.y + dy[i];
                Pair next = new Pair(nextX, nextY);
                if(!isRangeOver(next) && !visited[nextX][nextY] && map[nextX][nextY]){
                    visited[nextX][nextY] = true;
                    queue.add(next);
                }
            }
        }
    }
 
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str;
 
        int tc = Integer.parseInt(br.readLine());
        while(tc!=0) {
            str = br.readLine().split(" ");
            M = Integer.parseInt(str[0]);  //가로
            N = Integer.parseInt(str[1]); //세로
            int e = Integer.parseInt(str[2]);
 
            int x, y;
            for (int i = 0; i < e; ++i) {
                str = br.readLine().split(" ");
                x = Integer.parseInt(str[0]);
                y = Integer.parseInt(str[1]);
                map[x][y] = true;
            }
 
            int cnt = 0;
            for(int i=0;i<M;++i){
                for(int j=0;j<N;++j){
                    if(!visited[i][j] && map[i][j]){
                        bfs(i,j);
                        cnt++;
                    }
                }
            }
            System.out.println(cnt);
            visited = new boolean[51][51]; //초기화하는 방법으로 바꾸기
            map = new boolean[51][51]; //마찬가지
 
            tc--;
        }
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

5. 토마토

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
 
public class Main {
 
    static private int N;
    static private int M;
 
    static private int[] dx = {0,-1,0,1};
    static private int[] dy = {-1,0,1,0};
 
    static private int[][] map;
    static private int[][] visited;
    static private Queue<Pair> queue = new LinkedList<>();
    
    static class Pair{
        int x;
        int y;
 
        public Pair(int y, int x) {
            this.x = x;
            this.y = y;
        }
    }
 
    static boolean isRangeOver(Pair pair){
        return pair.x>=|| pair.y >=|| pair.x < 0 || pair.y < 0?true:false;
    }
 
    static void bfs(){
        while (!queue.isEmpty()){
            Pair cur = queue.peek();
            queue.remove();
 
            for(int k=0;k<4;++k){
                int nextY = cur.y + dy[k];
                int nextX = cur.x + dx[k];
 
                Pair next = new Pair(nextY, nextX);
 
                if(!isRangeOver(next) && map[nextY][nextX] == 0 && visited[nextY][nextX]==0){
                    map[nextY][nextX] = 1;
                    visited[nextY][nextX] = visited[cur.y][cur.x] + 1;
                    queue.add(next);
                }
            }
        }
    }
 
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str;
 
        str = br.readLine().split(" ");
 
        M = Integer.parseInt(str[0]); //가로
        N = Integer.parseInt(str[1]); //세로
 
        map = new int[N+1][M+1];
        visited = new int[N+1][M+1];
 
        for(int i =0;i<N;++i){
            str = br.readLine().split(" ");
            for(int j=0;j<M;++j){
                map[i][j] = Integer.parseInt(str[j]);
                if(map[i][j] == 1) queue.add(new Pair(i,j));
            }
        }
        bfs();
 
        int max = 0;
        for(int i=0;i<N;++i){
            for(int j=0;j<M;++j){
                if(map[i][j]==0){
                    System.out.println(-1);
                    return;
                }
                else if(max<visited[i][j]){
                    max = visited[i][j];
                }
            }
        }
        System.out.println(max);
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
연결요소나 유기농 배추의 문제의 경우, 1을 발견하면 그때 bfs()를 돌려서 bfs의 개수를 확인하는 문제였다. 이 문제를 연결요소처럼 풀어버리면, 1이 중복일 경우에 큰 문제가 된다. 1인 부분에서 bfs를 시작하고 결국 모든 경로를 탐색해버린다. 그리고 visited의 값도 계속 증가한다. 이러한 접근은 다른 1을 고려하지 않는 것이다. 그래서 처음에 queue에 add할 때, 1인 부분을 모두 찾았다. 그리고 하나씩 큐에서 빼면서 탐색을 하면 모든 1을 고려하게 된다.

 

이 문제는 dfs로 풀기 어렵다

 

6.상범빌딩

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
 
public class Main {
 
    private static int L; // 층수
    private static int R; // 행
    private static int C; // 열
 
    private static char[][][] map;
    private static int[][][] visited;
 
    private static int[] dz = {0,0,0,0,1,-1};
    private static int[] dy = {0,-1,0,1,0,0};
    private static int[] dx = {-1,0,1,0,0,0};
 
    static class Triple{
        int z;
        int y;
        int x;
        public Triple(int z, int y, int x) {
            this.z = z;
            this.y = y;
            this.x = x;
        }
    }
 
    private static boolean isRangeOver(Triple t){
        return t.x < 0 || t.x >= C || t.y < 0 || t.y >= R || t.z <0 || t.z >=L? true :false;
    }
 
    private static void bfs(Triple start){
        Queue<Triple> queue = new LinkedList<>();
        queue.add(start);
        visited[start.z][start.y][start.x] = 1;
 
        while (!queue.isEmpty()){
            Triple cur = queue.peek();
            queue.remove();
 
            int nextX,nextY,nextZ;
            for(int a=0;a<6;++a){
                nextX = cur.x + dx[a];
                nextY = cur.y + dy[a];
                nextZ = cur.z + dz[a];
 
                Triple next = new Triple(nextZ,nextY,nextX);
                if(!isRangeOver(next) && visited[nextZ][nextY][nextX]==0
                        && map[nextZ][nextY][nextX] != '#'){
                    visited[nextZ][nextY][nextX] = visited[cur.z][cur.y][cur.x] + 1;
                    queue.add(next);
 
                    if(map[nextZ][nextY][nextX] == 'E'return;
                }
            }
        }
    }
 
    public static void main(String[] args) throws Exception{
 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str;
 
        while (true){
            str = br.readLine().split(" ");
            L = Integer.parseInt(str[0]);
            R = Integer.parseInt(str[1]);
            C = Integer.parseInt(str[2]);
 
            map = new char[L+1][R+1][C+1];
            visited = new int[L+1][R+1][C+1];
 
            if(L == 0return;
 
            Triple start = null, finish = null;
            for(int k=0;k<L;++k){
                for(int i=0;i<R;++i){
                    str = br.readLine().split("");
                    for(int j=0;j<C;++j){
                        map[k][i][j] = str[j].charAt(0);
                        if(map[k][i][j] == 'S'){
                            start = new Triple(k,i,j);
                        }
                        if(map[k][i][j] == 'E'){
                            finish = new Triple(k,i,j);
                        }
                    }
                }
                br.readLine();
            }
 
            bfs(start);
 
            if(visited[finish.z][finish.y][finish.x] == 0){
                System.out.println("Trapped!");
            } else{
                int minutes = visited[finish.z][finish.y][finish.x] -1;
                System.out.println("Escaped in "+minutes+" minute(s).");
            }
        }
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

7. 적록색약

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
 
public class Main {
 
    private static int N;
    private static char[][] map;
    private static boolean[][] visited;
 
    private static int[] dx = {-1,0,1,0};
    private static int[] dy = {0,1,0,-1};
 
    private static class Pair{
        int y;
        int x;
 
        public Pair(int y, int x) {
            this.y = y;
            this.x = x;
        }
    }
 
    private static boolean isRangeOver(Pair p){
        return p.x < 0 || p.x >= N || p.y < 0 || p.y >= N ? true : false;
    }
 
    private static void bfs(char color, int y, int x){
        Queue<Pair> queue = new LinkedList<>();
        queue.add(new Pair(y,x));
        visited[y][x] = true;
 
        while (!queue.isEmpty()){
            Pair cur = queue.peek();
            queue.remove();
 
            int nextX, nextY;
            for(int i=0;i<4;++i){
                nextX = cur.x + dx[i];
                nextY = cur.y + dy[i];
 
                Pair next = new Pair(nextY, nextX);
                if(!isRangeOver(next) && map[nextY][nextX] == color && !visited[nextY][nextX]){
                    visited[nextY][nextX] = true;
                    queue.add(next);
                }
            }
        }
    }
 
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str;
 
        N = Integer.parseInt(br.readLine());
        map = new char[N+1][N+1];
        visited = new boolean[N+1][N+1];
 
        for(int i=0;i<N;++i){
            str = br.readLine().split("");
            for(int j=0;j<N;++j){
                map[i][j] = str[j].charAt(0);
            }
        }
        int nonColorblindness = 0;
        for(int i=0;i<N;++i){
            for(int j=0;j<N;++j){
                if(!visited[i][j]){
                    bfs(map[i][j], i, j);
                    nonColorblindness++;
                }
            }
        }
 
        for(int i=0;i<N;++i){
            for(int j=0;j<N;++j){
                if(map[i][j] == 'R'){
                    map[i][j] = 'G';
                }
            }
        }
        
        visited = new boolean[N+1][N+1];
        int colorblindness = 0;
        for(int i=0;i<N;++i){
            for(int j=0;j<N;++j){
                if(!visited[i][j]){
                    bfs(map[i][j],i,j);
                    colorblindness++;
                }
            }
        }
        System.out.println(nonColorblindness +" " + colorblindness);
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

8. 안전영역

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
 
public class Main {
 
    private static int N;
    private static int[][] map;
    private static boolean[][] visited;
 
    private static int[] dy= {0,1,0,-1};
    private static int[] dx = {-1,0,1,0};
 
    private static class Pair{
        int y;
        int x;
 
        public Pair(int y, int x) {
            this.y = y;
            this.x = x;
        }
    }
 
    private static boolean isRangeOver(Pair p){
        return p.x<0 || p.y < 0 || p.x >=|| p.y >= N ? true:false;
    }
 
    private static void bfs(int height, int i, int j){
        Queue<Pair> queue = new LinkedList<>();
        queue.add(new Pair(i,j));
        visited[i][j] = true;
 
        while (!queue.isEmpty()){
            Pair cur = queue.peek();
            queue.remove();
 
            int nextX, nextY;
            for(int a=0;a<4;++a){
                nextX = cur.x + dx[a];
                nextY = cur.y + dy[a];
 
                Pair next = new Pair(nextY,nextX);
                if(!isRangeOver(next) && map[nextY][nextX]>height && !visited[nextY][nextX]){
                    queue.add(next);
                    visited[nextY][nextX] = true;
                }
            }
        }
    }
 
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str;
 
        N = Integer.parseInt(br.readLine());
        map = new int[N+1][N+1];
        visited = new boolean[N+1][N+1];
 
        for(int i=0;i<N;++i){
            str = br.readLine().split(" ");
            for(int j=0;j<N;++j){
                map[i][j] = Integer.parseInt(str[j]);
            }
        }
 
        int maxGroup = 0;
        int height = 0;
 
        while (true){
            boolean flag = false;
            int group = 0;
            for(int i=0;i<N;++i){
                for(int j=0;j<N;++j){
                    if(map[i][j]>height && !visited[i][j]){
                        bfs(height,i,j);
                        group++;
                        flag = true;
                    }
                }
            }
 
            if(!flag) break;
 
            if(maxGroup<group){
                maxGroup = group;
            }
            //visited = new boolean[N+1][N+1];
            for(int i=0;i<N;++i){
                Arrays.fill(visited[i],false);
            }
            height++;
        }
        System.out.println(maxGroup);
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

새롭게 동적할당을 해도 좋지만, 초기화하는 방법으로 하자

 

9. 스타트 링크

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
 
public class Main {
 
    private static int F;
    private static int S;
    private static int G;
    private static int U;
    private static int D;
 
    private static int[] upOrDown = new int[2];
 
    private static int[] visited;
 
    private static boolean isRangeOver(int c){
        return c<=0 || c>F ? true:false;
    }
 
    private static void bfs(){
        Queue<Integer> queue = new LinkedList<>();
        queue.add(S);
        visited[S] = 1;
 
        while (!queue.isEmpty()){
            int cur = queue.peek();
            queue.remove();
 
            for(int i=0;i<2;++i){
                int next = cur + upOrDown[i];
                if(!isRangeOver(next) && visited[next] == 0){
                    visited[next] = visited[cur] + 1;
                    queue.add(next);
                    if(next == G) return;
                }
            }
        }
    }
 
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str;
 
        str = br.readLine().split(" ");
 
        F = Integer.parseInt(str[0]); //가장 높은층
        S = Integer.parseInt(str[1]); //시작 층
        G = Integer.parseInt(str[2]); //목표 층
        U = Integer.parseInt(str[3]); //위 단위
        D = Integer.parseInt(str[4]); // 밑 단위
 
        visited = new int[F+1];
        upOrDown[0= U;
        upOrDown[1= -D;
 
        bfs();
 
        if(visited[G] == 0){
            System.out.println("use the stairs");
        } else{
            System.out.println(visited[G]-1);
        }
 
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

10. 숨바꼭질

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
public class Main {
 
    private static int N;
    private static int K;
 
    private static int[] move = new int[3];
    private static int[] visited = new int[200001];
 
    private static void bfs(){
        Queue<Integer> queue = new LinkedList<>();
        queue.add(N);
        visited[N] = 1;
 
        while (!queue.isEmpty()){
            int cur = queue.peek();
            queue.remove();
 
            move[0= cur - 1;
            move[1= cur + 1;
            move[2= cur * 2;
 
            int next;
            for(int i=0;i<3;++i){
                next = move[i];
                if(next>=0 && next<=200000 && visited[next] == 0){
                    queue.add(next);
                    visited[next] = visited[cur] + 1;
                    if(next == K) return;
                }
            }
        }
    }
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str;
 
        str = br.readLine().split(" ");
        N = Integer.parseInt(str[0]);
        K = Integer.parseInt(str[1]);
 
        bfs();
 
        System.out.println(visited[K]-1);
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

대략 10문제정도 풀어보았다. 문제가 크게 어렵지는 않았다. JAVA로 문제는 처음 풀어보았다.

그리고 visited를 초기화해야할 때, 그냥 새롭게 할당해버렸는데 좋은 습관은 아닌거 같다. 그래서 초기화하는 방법은 뒤에 추가했다.(안전영역)

문제를 기계처럼 푸는게 아니라, 해당 문제가 왜 BFS/DFS로 해결되는지 알아야한다.