[백준] 3184번: 양 - Kotlin[코틀린]

2024. 4. 25. 21:10·알고리즘/Baekjoon

문제

 

 

3184번: 양

첫 줄에는 두 정수 R과 C가 주어지며(3 ≤ R, C ≤ 250), 각 수는 마당의 행과 열의 수를 의미한다. 다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.

www.acmicpc.net

 

 


풀이

 

 큐를 이용한 너비 우선 탐색(BFS)으로 해결하였다. 반복문을 통해 울타리가 아닌 경우에 BFS 탐색을 수행하고 방문을 처리 해준다.

 

 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 (rows, cols) = br.readLine().split(' ').map { it.toInt() }
    val map = Array(rows){ br.readLine() }
    val visited = Array(rows){ BooleanArray(cols) }
    val dx = arrayOf(1, 0, -1, 0)
    val dy = arrayOf(0, 1, 0, -1)

    var sheep = 0 // 살아있는 양
    var wolf = 0 // 살아있는 늑대

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

        var wCnt = 0
        var sCnt = 0

        if(map[x][y] == 'o') {
            sCnt++
        }
        if(map[x][y] == 'v') {
            wCnt++
        }

        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 >= rows || ny < 0 || ny >= cols) continue
                if(visited[nx][ny]) continue
                if(map[nx][ny] == '#') continue // 울타리인 경우 넘어감
                visited[nx][ny] = true

                if(map[nx][ny] == 'o') {
                    sCnt++
                }
                if(map[nx][ny] == 'v') {
                    wCnt++
                }
                queue.add(Point(nx, ny))
            }
        }

        if(sCnt > wCnt) { // 살아있는 양과 늑대의 수 계산
            sheep += sCnt
        } else {
            wolf += wCnt
        }
    }

    for(i in 0 until rows) {
        for(j in 0 until cols) {
            if(map[i][j] != '#' && !visited[i][j]) {
                bfs(i, j)
            }
        }
    }

    bw.write("$sheep $wolf")
    bw.flush()
    bw.close()
    br.close()
}

 

 

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

[백준] 2023번: 신기한 소수 - Kotlin[코틀린]  (0) 2024.04.17
[백준] 15903번: 카드 합체 놀이 - Kotlin[코틀린]  (0) 2024.04.16
[백준] 11441번: 합 구하기 - Kotlin[코틀린]  (0) 2024.04.09
[백준] 11047번: 동전 0 - Kotlin[코틀린]  (0) 2024.04.01
[백준] 5052번: 전화번호 목록 - Kotlin[코틀린]  (0) 2024.03.27
'알고리즘/Baekjoon' 카테고리의 다른 글
  • [백준] 2023번: 신기한 소수 - Kotlin[코틀린]
  • [백준] 15903번: 카드 합체 놀이 - Kotlin[코틀린]
  • [백준] 11441번: 합 구하기 - Kotlin[코틀린]
  • [백준] 11047번: 동전 0 - Kotlin[코틀린]
junghoooooon
junghoooooon
  • junghoooooon
    코드팁스
    junghoooooon
  • 전체
    오늘
    어제
    • 전체 (120)
      • 안드로이드 (0)
        • 코드팁스 (0)
      • 유니티 (0)
        • 코드팁스 (0)
      • 알고리즘 (118)
        • 알고리즘 (0)
        • Baekjoon (118)
      • GitHub (0)
      • 티스토리 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

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

    티스토리툴바