[백준] 2667번: 단지번호붙이기 - Kotlin[코틀린]

2023. 7. 26. 18:20·알고리즘/Baekjoon

문제

 

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여

www.acmicpc.net

 


풀이

 

 재귀로 구현한 DFS와 큐로 구현한 BFS로 해결할 수 있다. 단지와 집의 수는 mutableList를 이용해 저장해주었다.

 

 주어진 graph를 순회하며 방문한적이 없고 graph가 1인 경우 단지를 추가하고 DFS나 BFS를 호출한다. DFS의 경우에는 graph가 방문하지않고 1인 경우에 다시 DFS함수를 호출해주고, 호출될 때 마다 집의 수를 1 증가시킨다. BFS의 경우에는 해당하는 경우에 Queue에 추가해주고 집의 수를 1 증가시킨다.

 

 리스트를 오름차순으로 정렬하고 리스트의 크기(단지 수)와 내용(집의 수)을 출력하면 된다.

 


코드

 

- DFS

fun main() {
    val br = System.`in`.bufferedReader()
    val bw = System.out.bufferedWriter()

    val dx = arrayOf(1, 0, -1, 0) // 방향
    val dy = arrayOf(0, 1, 0, -1)

    val num = br.readLine().toInt()
    val graph = Array(num){ IntArray(num) }
    val visited = Array(num){ BooleanArray(num) }
    val ans = mutableListOf<Int>() // 단지와 집의 수를 저장할 리스트

    for(i in 0 until num) {
        val line = br.readLine()
        for(j in 0 until num) {
            graph[i][j] = line[j] - '0'
        }
    }

    fun dfs(x: Int, y: Int) {
        visited[x][y] = true
        ans[ans.size-1]++

        for(i in 0 until 4) {
            val nx = x + dx[i]
            val ny = y + dy[i]

            if(nx < 0 || nx >= num || ny < 0 || ny >= num) continue
            if(visited[nx][ny]) continue

            if(graph[nx][ny] == 1) { // 새로운 집
                dfs(nx, ny)
            }
        }
    }

    for(i in 0 until num) {
        for(j in 0 until num) {
            if(visited[i][j]) continue
            if(graph[i][j] == 1) { // 새로운 단지
                ans.add(0)
                dfs(i,j)
            }
        }
    }

    ans.sort() // 오름차순 정렬

    bw.append("${ans.size}\n")
    ans.forEach {
        bw.append("$it\n")
    }

    bw.write("")
    bw.flush()
    bw.close()
    br.close()
}

 

- BFS

import java.util.*

data class Point(val x: Int, val y: Int)

fun main() {
    val br = System.`in`.bufferedReader()
    val bw = System.out.bufferedWriter()

    val dx = arrayOf(1, 0, -1, 0)
    val dy = arrayOf(0, 1, 0, -1)

    val num = br.readLine().toInt()
    val graph = Array(num){ IntArray(num) }
    val visited = Array(num){ BooleanArray(num) }
    val ans = mutableListOf<Int>() // 단지와 집의 수를 저장할 리스트

    for(i in 0 until num) {
        val line = br.readLine()
        for(j in 0 until num) {
            graph[i][j] = line[j] - '0'
        }
    }

    fun bfs(x: Int, y: Int) {
        val queue : Queue<Point> = LinkedList()
        visited[x][y] = true
        ans[ans.size-1]++
        queue.add(Point(x, y))

        while (queue.isNotEmpty()) {
            val cur = queue.poll()

            for(i in 0 until 4) {
                val nx = cur.x + dx[i]
                val ny = cur.y + dy[i]

                if(nx < 0 || nx >= num || ny < 0 || ny >= num) continue
                if(visited[nx][ny]) continue

                if(graph[nx][ny] == 1) { // 새로운 집
                    visited[nx][ny] = true
                    ans[ans.size-1]++
                    queue.add(Point(nx, ny))
                }
            }
        }
    }

    for(i in 0 until num) {
        for(j in 0 until num) {
            if(visited[i][j]) continue
            if(graph[i][j] == 1) { // 새로운 단지
                ans.add(0)
                bfs(i,j)
            }
        }
    }

    ans.sort() // 오름차순으로 정렬

    bw.append("${ans.size}\n")
    ans.forEach {
        bw.append("$it\n")
    }

    bw.write("")
    bw.flush()
    bw.close()
    br.close()
}

 

'알고리즘 > Baekjoon' 카테고리의 다른 글

[백준] 2606번: 바이러스 - Kotlin[코틀린]  (0) 2023.07.31
[백준] 2583번: 영역 구하기 - Kotlin[코틀린]  (0) 2023.07.27
[백준] 2178번: 미로 탐색 - Kotlin[코틀린]  (0) 2023.07.25
[백준] 9012번: 괄호 - Kotlin[코틀린]  (0) 2023.07.25
[백준] 7568번: 덩치 - Kotlin[코틀린]  (0) 2023.07.21
'알고리즘/Baekjoon' 카테고리의 다른 글
  • [백준] 2606번: 바이러스 - Kotlin[코틀린]
  • [백준] 2583번: 영역 구하기 - Kotlin[코틀린]
  • [백준] 2178번: 미로 탐색 - Kotlin[코틀린]
  • [백준] 9012번: 괄호 - Kotlin[코틀린]
junghoooooon
junghoooooon
  • junghoooooon
    코드팁스
    junghoooooon
  • 전체
    오늘
    어제
    • 전체 (120)
      • 안드로이드 (0)
        • 코드팁스 (0)
      • 유니티 (0)
        • 코드팁스 (0)
      • 알고리즘 (118)
        • 알고리즘 (0)
        • Baekjoon (118)
      • GitHub (0)
      • 티스토리 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      정렬
      티스토리
      크루스칼
      분리집합
      분할 정복
      유니온파인드
      그래프 탐색
      투 포인터
      백트래킹
      우선순위 큐
      그리디
      수학
      브루트포스
      그래프이론
      BFS
      누적 합
      구현
      소수 판정
      프림
      스택
      DP
      이분 탐색
      큐
      모듈러 곱셈 역원
      에라토스테네스의 체
      MST
      피보나치
      문자열
      dfs
      재귀
    • hELLO· Designed By정상우.v4.10.2
    junghoooooon
    [백준] 2667번: 단지번호붙이기 - Kotlin[코틀린]
    상단으로

    티스토리툴바