나의 Winding Road

BAEKJOON 1260번: DFS와 BFS 본문

개발/Algorithm

BAEKJOON 1260번: DFS와 BFS

WindingRoad 2017. 4. 17. 21:54

[2017-04-15 토요일]

    * 내용: DFS BFS

    1. 문제

    2. 해결 방법

       

       

      1. 문제


      내용

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


      * 예제 입출력: 문제의 테스트 케이스기 너무 적어서 직접 그리며 생성하였다.

      번호

      입력

      출력

      1

      5 8 1

      1 2

      1 4

      1 3

      3 4

      3 5

      2 5

      2 4

      5 4

      1 2 4 3 5

      1 2 3 4 5

      2

      9 12 7

      1 2

      1 5

      2 3

      2 4

      2 5

      4 5

      6 5

      8 5

      5 3

      3 7

      7 9

      3 9

      7 3 2 1 5 4 6 8 9

      7 3 9 2 5 1 4 6 8

      3

      6 9 1

      1 2

      1 3

      2 4

      2 5

      4 5

      4 6

      4 3

      5 6

      6 3

      1 2 4 3 6 5

      1 2 3 4 5 6

      4

      6 10 30000

      30000 37

      30000 40

      30000 26

      37 7

      37 40

      40 7

      40 26

      40 99

      99 26

      99 7

      30000 26 40 7 37 99

      30000 26 37 40 99 7


      2. 해결 방법


      이슈

      A. break문의 올바르지 않은 사용  break 삭제 처리



      B. 정렬 시킨 값을 세팅해주지 않아 제대로 정렬이 되지 않음

       

      C. package 포함  계속해서 실패나는 현상

       BAEKJOON 사이트에서 package 코드를 같이 넣으면 실패로 떨어진다.

      이것 때문에 새벽까지 계속 매달렸다ㅠㅠ 그래도 덕분에 많은 도움이 되었다.

      소스코드를 꼼곰하게 보고 무슨 에러가 있을지 다시   생각하는 습관을 기르는데 도움이 되었다... 믿는다ㅠㅠ

       

      소스코드

       DFS BFS 대해 이해하기 위해 따로 따로 작성  제출하여 중복된 소스코드가 많다.


      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
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      125
      126
      127
      128
      129
      130
      131
      132
      133
      134
      135
      136
      137
      138
      139
      140
      141
      142
      143
      144
      145
      146
      147
      148
      149
      150
      151
      152
      153
      154
      155
      156
      157
      158
      159
      160
      161
      162
      163
      164
      165
      166
      167
      168
      169
      170
      171
      172
      173
      174
      175
      176
      177
      178
      179
      180
      181
      182
      183
      184
      185
      186
      187
      188
      189
      190
      191
      192
      193
      194
      195
      196
      197
      198
      199
      200
      201
      202
      203
      204
      205
      206
      207
      208
      209
      210
      211
      212
      213
      214
      215
      216
      217
      218
      219
      220
      221
      222
      223
      224
      225
      226
      227
      228
      229
      230
      231
      232
      233
      234
      235
      236
      237
      238
      239
      240
      241
      242
      243
      244
      245
      246
      247
      248
      249
      250
      251
      252
      253
      254
      255
      256
      257
      258
      259
      260
      261
      262
      263
      264
      265
      266
      267
      268
      269
      270
      271
      272
      273
      274
      275
      276
      277
      278
      279
      280
      281
      282
      283
      284
      285
      286
      287
      288
      289
      290
      291
      292
      293
      294
      295
      296
      297
      298
      299
      300
      301
      302
      303
      304
      305
      306
      307
      308
      309
      310
      311
      312
      313
      314
      315
      316
      317
      318
      319
      320
      package BAEKJOON; //제출 시에는 반드시 삭제
       
      import java.util.*;
       
      /**
       * Created by WindingRoad on 2017-04-15.
       */
       
      @SuppressWarnings("Duplicates"// 중복 코드 표시 중지
      public class BAEKJOON_1260 {
       
          private static int n;
          private static int m;
          private static int v;
          private static int[] edgeArr;
          private static Scanner scanner;
       
          // 테스트용
          public static void main(String args[]) throws Exception {
              int temp = 0;
       
              scanner = new Scanner(System.in);
       
              if (scanner.hasNextInt()) {
                  temp = scanner.nextInt();
                  if (temp >= 1 && temp <= 1000)
                      n = temp;
                  else
                      return;
              }
              else {
                  return;
              }
       
              if (scanner.hasNextInt()) {
                  temp = scanner.nextInt();
                  if (temp >= 1 && temp <= 10000)
                      m = temp;
                  else
                      return;
              }
              else {
                  return;
              }
       
              if (scanner.hasNextInt()) {
                  temp = scanner.nextInt();
                  v = temp;
              }
              else {
                  return;
              }
       
              edgeArr = new int[m * 2];
       
              for (int i = 1; i <= m * 2; i++) {
                  if (scanner.hasNextInt()) {
                      temp = scanner.nextInt();
                      edgeArr[i - 1= temp;
                  }
                  else
                      return;
              }
       
              // N(1≤N≤1,000), M(1≤M≤10,000)
              DepthFirstSearch depthFirstSearch = new DepthFirstSearch(n, m, v, edgeArr);
              depthFirstSearch.setListMap();
              depthFirstSearch.searchPath(v); // v: 시작 vertex
              depthFirstSearch.printResultPath();
       
              System.out.println();
       
              BreadthFirstSearch breadthFirstSearch = new BreadthFirstSearch(n, m, v, edgeArr);
              breadthFirstSearch.setListMap();
              breadthFirstSearch.searchPath(v); // v: 시작 vertex
              breadthFirstSearch.printResultPath();
          }
      }
       
      @SuppressWarnings("Duplicates"// 중복 코드 표시 중지
      class DepthFirstSearch {
       
          private HashMap<Integer, Node> adjMap;
          private ArrayList<Integer> resultList;
          private ArrayList<Integer> nodeNumList;
       
          private int n;
          private int m;
          private int v;
          private int[] edgeArr;
       
          public DepthFirstSearch(int n, int m, int v, int[] edgeArr) {
              this.n = n;
              this.m = m;
              this.v = v;
              this.edgeArr = edgeArr;
          }
       
          public void setListMap() {
              adjMap = new HashMap<Integer, Node>();
              resultList = new ArrayList<>();
              nodeNumList = new ArrayList<>();
       
              for(int i = 1; i <= m * 2; i+= 2) {
                  int v1 = edgeArr[i-1];
                  int v2 = edgeArr[i];
       
                  setNodeLink(adjMap, v1, v2);
              }
       
              for(Integer key : nodeNumList) {
                  LinkedList<Integer> tempList = adjMap.get(key).getLinkedList();
                  Collections.sort(tempList);
                  adjMap.get(key).setLinkedList(tempList);
              }
       
              /*
              for(Integer key : nodeNumList) {
                  System.out.println("key: " + key);
                  for(Integer temp : adjMap.get(key).getLinkedList()) {
                      System.out.print(temp + " ");
                  }
                  System.out.println("\n");
              }
              */
       
       
              // System.out.println(String.valueOf(v)); // 시작점
          }
       
          public void searchPath(int v) {
              if(adjMap.get(v).isVisited() == false) {
                  adjMap.get(v).setVisited(true);
       
                  // System.out.print(String.valueOf(v) + " "); // 출력
                  resultList.add(v);
       
                  for(Integer vertex : adjMap.get(v).getLinkedList()) {
                      if(adjMap.get(vertex).isVisited() == false) {
                          searchPath(vertex);
                      }
                  }
              }
          }
       
          private void setNodeLink(HashMap<Integer, Node> adjMap, int v1, int v2) {
              if(adjMap.get(v1) != null) {
                  if(!adjMap.get(v1).getLinkedList().contains(v2))
                      adjMap.get(v1).getLinkedList().add(v2);
              }
              else {
                  adjMap.put(v1, new Node(false, v2));
                  adjMap.get(v1).getLinkedList().add(v2);
                  nodeNumList.add(v1);
              }
       
              if(adjMap.get(v2) != null) {
                  if(!adjMap.get(v2).getLinkedList().contains(v1))
                      adjMap.get(v2).getLinkedList().add(v1);
              }
              else {
                  adjMap.put(v2, new Node(false, v1));
                  adjMap.get(v2).getLinkedList().add(v1);
                  nodeNumList.add(v2);
              }
          }
       
          public void printResultPath() {
              int count = 0;
              int size = resultList.size();
              for(Integer temp : resultList) {
                  if( (count + 1== size ) {
                      System.out.printString.valueOf(temp) );
                      count++;
                  }
                  else {
                      System.out.printString.valueOf(temp) + " " );
                      count++;
                  }
              }
          }
       
      }
       
      @SuppressWarnings("Duplicates"// 중복 코드 표시 중지
      class BreadthFirstSearch {
       
          private HashMap<Integer, Node> adjMap;
          private Queue<Integer> pathQueue;
          private ArrayList<Integer> resultList;
          private ArrayList<Integer> nodeNumList;
       
          private int n;
          private int m;
          private int v;
          private int[] edgeArr;
       
          public BreadthFirstSearch(int n, int m, int v, int[] edgeArr) {
              this.n = n;
              this.m = m;
              this.v = v;
              this.edgeArr = edgeArr;
          }
       
          public void setListMap() {
              adjMap = new HashMap<Integer, Node>();
              resultList = new ArrayList<>();
              pathQueue = new LinkedList<>();
              nodeNumList = new ArrayList<>();
       
              for (int i = 1; i <= m * 2; i += 2) {
                  int v1 = edgeArr[i-1];
                  int v2 = edgeArr[i];
       
                  setNodeLink(v1, v2);
              }
       
              for(Integer key : nodeNumList) {
                  LinkedList<Integer> tempList = adjMap.get(key).getLinkedList();
                  Collections.sort(tempList);
                  adjMap.get(key).setLinkedList(tempList);
              }
       
              /*
              for(Integer key : nodeNumList) {
                  System.out.println("key: " + key);
                  for(Integer temp : adjMap.get(key).getLinkedList()) {
                      System.out.print(temp + " ");
                  }
                  System.out.println("\n");
              }
              */
       
              // System.out.println(String.valueOf(v)); // 시작점
          }
       
          public void searchPath(int v) {
              if (adjMap.get(v).isVisited() == false) {
                  adjMap.get(v).setVisited(true);
       
                  // System.out.print(String.valueOf(v) + " "); // 출력
                  resultList.add(v);
       
                  for (Integer vertex : adjMap.get(v).getLinkedList()) {
                      if (adjMap.get(vertex).isVisited() == false && !pathQueue.contains(vertex)) {
                          pathQueue.add(vertex); // Enqueue
                      }
                  }
       
                  if(!pathQueue.isEmpty())
                      searchPath(pathQueue.poll()); // Dequeue
              }
          }
       
          public void setNodeLink(int v1, int v2) {
              if(adjMap.get(v1) != null) {
                  if(!adjMap.get(v1).getLinkedList().contains(v2))
                      adjMap.get(v1).getLinkedList().add(v2);
              }
              else {
                  adjMap.put(v1, new Node(false, v2));
                  adjMap.get(v1).getLinkedList().add(v2);
                  nodeNumList.add(v1);
              }
       
              if(adjMap.get(v2) != null) {
                  if(!adjMap.get(v2).getLinkedList().contains(v1))
                      adjMap.get(v2).getLinkedList().add(v1);
              }
              else {
                  adjMap.put(v2, new Node(false, v1));
                  adjMap.get(v2).getLinkedList().add(v1);
                  nodeNumList.add(v2);
              }
          }
       
          public void printResultPath() {
              int count = 0;
              int size = resultList.size();
              for (Integer temp : resultList) {
                  if ((count + 1== size) {
                      System.out.print(String.valueOf(temp));
                      count++;
                  } else {
                      System.out.print(String.valueOf(temp) + " ");
                      count++;
                  }
              }
          }
       
      }
       
      class Node {
          private boolean visited;
          private int v;
          private LinkedList<Integer> linkedList;
       
          Node(boolean visited, int v) {
              this.visited = visited;
              this.v = v;
              linkedList = new LinkedList<>();
          }
       
          public boolean isVisited() {
              return visited;
          }
       
          public void setVisited(boolean visited) {
              this.visited = visited;
          }
       
          public LinkedList<Integer> getLinkedList() {
              return linkedList;
          }
       
          public void setLinkedList(LinkedList<Integer> linkedList) {
              this.linkedList = linkedList;
          }
      }
       
      cs


      '개발 > Algorithm' 카테고리의 다른 글

      BAEKJOON 10825번: 국영수  (0) 2018.09.04
      BAEKJOON 9465번: 스티커  (0) 2018.09.02
      BAEKJOON 1463번: 1로 만들기  (0) 2018.08.30
      로봇 청소기  (0) 2017.04.17
      BAEKJOON 13458번: 시험 감독  (0) 2017.04.09
      Comments