새발블로그

디버깅 Tip 본문

Problem Solving/Refer

디버깅 Tip

EUG 2025. 7. 4. 17:31

디버깅의 핵심

디버깅의 목적은 코드가 실제로 어떻게 동작하고 있는지 이해하는 것

  • 특정 시점에 변수 값이 어떻게 변하고 있는지
  • 어떤 조건에서 코드의 흐름이 바뀌는지
  • 어느 부분에서 예상과 다른 결과가 나오는지

이러한 점들을 파악하기 위해 출력문을 적절한 위치에 추가하는 방식이 효과적..

디버깅을 효과적으로 하는 방법

  1. 문제가 생긴 부분부터 출력해 보기
    • 예상과 다르게 동작하는 지점에 System.out.println() 등을 추가해 직접 확인
  2. 변수의 변화 과정을 추적
    • 모든 값을 출력할 필요는 없고, 문제 해결에 필요한 값만 선별적으로 확인

BFS에서 디버깅 적용하기

디버깅 포인트

  • 큐(queue)의 현재 상태
  • 현재 방문 중인 노드
  • 다음에 방문할 예정인 노드
  • 방문한 노드 목록
public static void bfs(Map<Integer, List<Integer>> graph, int startVertex) {
    Queue<Integer> queue = new LinkedList<>();
    Set<Integer> visited = new HashSet<>();

    queue.add(startVertex);
    visited.add(startVertex);

    while (!queue.isEmpty()) {
        System.out.println("현재 큐 상태: " + queue);  // 디버깅
        int curVertex = queue.remove();
        System.out.println("현재 방문 노드: " + curVertex);  // 디버깅

        for (int nextVertex : graph.getOrDefault(curVertex, Collections.emptyList())) {
            if (!visited.contains(nextVertex)) {
                System.out.println("다음 방문 예정 노드: " + nextVertex);  // 디버깅
                queue.add(nextVertex);
                visited.add(nextVertex);
                System.out.println("방문 상태: " + visited);  // 디버깅
            }
        }
    }
}

예시 입력 및 출력

Map<Integer, List<Integer>> graph = new HashMap<>();
graph.put(0, List.of(1, 3, 6));
graph.put(1, List.of(0, 3));
graph.put(2, List.of(3));
graph.put(3, List.of(0, 1, 2, 7));
graph.put(4, List.of(5));
graph.put(5, List.of(4, 6, 7));
graph.put(6, List.of(0, 5));
graph.put(7, List.of(3, 5));

bfs(graph, 0);
// 출력 예시 일부
현재 큐 상태: [0]
현재 방문 노드: 0
다음 방문 예정 노드: 1
방문 상태: [0, 1]
다음 방문 예정 노드: 3
방문 상태: [0, 1, 3]
다음 방문 예정 노드: 6
방문 상태: [0, 1, 3, 6]
...

 

DFS에서 디버깅 적용하기

재귀 깊이를 추적하여 출력에 들여쓰기를 추가하면 흐름을 시각적으로 이해하기 쉬워진다.

DFS 구현 및 디버깅 코드

private static int depth = 0;

public static void dfs(Map<Integer, List<Integer>> graph, int curVertex, Set<Integer> visited) {
    visited.add(curVertex);
    System.out.println("   ".repeat(depth) + "ㄴ" + curVertex);  // 들여쓰기 출력

    depth++;  // 깊이 증가
    for (int nextVertex : graph.getOrDefault(curVertex, Collections.emptyList())) {
        if (!visited.contains(nextVertex)) {
            dfs(graph, nextVertex, visited);
        }
    }
    depth--;  // 깊이 감소
}

예시 입력 및 출력

Map<Integer, List<Integer>> graph = new HashMap<>();
graph.put(0, List.of(1, 3, 6));
graph.put(1, List.of(0, 3));
graph.put(2, List.of(3));
graph.put(3, List.of(0, 1, 2, 7));
graph.put(4, List.of(5));
graph.put(5, List.of(4, 6, 7));
graph.put(6, List.of(0, 5));
graph.put(7, List.of(3, 5));

Set<Integer> visited = new HashSet<>();
dfs(graph, 3, visited);
ㄴ3
   ㄴ0
      ㄴ1
      ㄴ6
         ㄴ5
            ㄴ4
            ㄴ7
   ㄴ2

 

'Problem Solving > Refer' 카테고리의 다른 글

암시적 그래프 dfs 템플릿  (0) 2025.07.04
암시적 그래프 bfs 템플릿  (0) 2025.07.04
연결된 영역 개수 찾는 유형  (0) 2025.07.04
BFS 템플릿  (0) 2025.07.04
DFS 템플릿  (0) 2025.07.04