[백준] 1260 - DFS와 BFS

오규성·2025년 10월 20일

지금까지 배운 DFS, BFS 를 종합하여 출력하는 문제이다.
시간을 짧게 사용하기 위해 공용으로 사용할 변수를 1개 선언하여 사용하였다.

풀이

/*
* 정점 번호가 작은 것부터 방문이므로 오름차순
* 양방향 그래프.
* 정점 번호는 1 ~ N
*
* 첫째줄 DFS, 둘째줄 BFS.
* 정점 N, 간선 M, 시작점 V
*
* 방문하는 정점을 순서대로 출력해야한다.
* */

private lateinit var adjacencyList: Array<MutableList<Int>>
private lateinit var visitedArr: BooleanArray
private var stringBuilder = StringBuilder()
private val dequeue = ArrayDeque<Int>()

fun `1260-DFS와 BFS`(){
    val br = System.`in`.bufferedReader()
    val bw = System.out.bufferedWriter()
    val (n, m, v) = br.readLine().split(" ").map { it.toInt() }

    adjacencyList = Array(n + 1){ mutableListOf()}
    visitedArr = BooleanArray(n + 1)

    repeat(m){
        val token = java.util.StringTokenizer(br.readLine())
        val from = token.nextToken().toInt()
        val to = token.nextToken().toInt()

        adjacencyList[from].add(to)
        adjacencyList[to].add(from)
    }

    // 인접리스트 오름차순 정렬 후 dfs 진행
    adjacencyList.forEach { it.sort() }

    dfs(v)

    // 초기화 및 줄넘김 처리
    dequeue.fill(0)
    visitedArr.fill(false)
    stringBuilder.append("\n")

    bfs(v)

    bw.write(stringBuilder.toString())
    bw.flush()
    bw.close()
    br.close()
}

private fun dfs(from: Int){
    dequeue.addLast(from)

    while (dequeue.isNotEmpty()){
        val from = dequeue.removeLast()

        if(visitedArr[from]) continue

        visitedArr[from] = true

        if(stringBuilder.isNotEmpty()){
            stringBuilder.append(" ")
        }
        stringBuilder.append("${from}")

        for(to in adjacencyList[from].asReversed()){
            if(!visitedArr[to]){
                dequeue.addLast(to)
            }
        }
    }
}

private fun bfs(from: Int){
    dequeue.addFirst(from)
    visitedArr[from] = true
    stringBuilder.append("${from}")

    while (dequeue.isNotEmpty()){
        val from = dequeue.removeFirst()

        for(to in adjacencyList[from]){
            if(!visitedArr[to]){
                visitedArr[to] = true
                stringBuilder.append(" ${to}")
                dequeue.addLast(to)
            }
        }
    }
}

후기

DFS, BFS 두 개를 구현하여 풀이하고, 반복문으로 풀이하다보니 add 및 remove 를 언제해야할지 헷갈려 몇 번 틀렸다.
문제의 지문도 잘못읽어 방문 정점을 출력하는 것이 아닌, 순서로 출력하여 틀리기도 하였고 dfs 에서 visited 처리의 위치도 잘못 놓아 틀리기도 하였다.

문제의 지문을 잘 읽고, 자체적으로 테스트 케이스를 주어 풀이하는 습관을 더 들여야 할 것 같다.

profile
안드로이드 개발자 Gyu 의 개발 블로그 !

0개의 댓글