[백준] 3055번: 탈출 - Kotlin[코틀린]

2024. 1. 12. 21:49·알고리즘/Baekjoon

문제

 

 

3055번: 탈출

사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제

www.acmicpc.net

 


풀이

 

 고슴도치가 비버의 굴로 이동하는 가장 빠른 시간을 찾는 문제로 BFS로 해결할 수 있다. 탐색에서 물이 차는 것도 고려해야하기 때문에 Queue를 물과 고슴도치 두 개를 이용하여 해결한다.

 

 물이 찰 예정인 칸으로 고슴도치는 이동할 수 없기때문에 한 싸이클을 물의 이동 -> 고슴도치의 이동의 순서로 구성하고 탐색을 수행한다. 물이나 고슴도치의 이동은 해당하는 현재 큐의 크기만큼 수행하고 빈공간을 만났을 때 이동한다. 고슴도치는 도착한 시간을 저장해주고 도착 지점에 도달하면 최단 시간을 갱신해준다.

 


코드

 

import java.util.*

data class Point(val x: Int, val y: Int, val time: 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 (rows, cols) = br.readLine().split(' ').map { it.toInt() }
    val map = Array(rows){ br.readLine().toString().toCharArray() }
    var ans = Int.MAX_VALUE
    val queue : Queue<Point> = LinkedList()
    val water : Queue<Point> = LinkedList()

    fun bfs() {
        while (queue.isNotEmpty()) {
            repeat(water.size) {
                val tmp = water.poll()
                for(d in 0 until 4) {
                    val nx = tmp.x + dx[d]
                    val ny = tmp.y + dy[d]

                    if(nx < 0 || nx >= rows || ny < 0 || ny >= cols) continue
                    if(map[nx][ny] == '.') {
                        map[nx][ny] = '*'
                        water.offer(Point(nx, ny, 0))
                    }
                }
            }
            repeat(queue.size) {
                val tmp = queue.poll()
                for(d in 0 until 4) {
                    val nx = tmp.x + dx[d]
                    val ny = tmp.y + dy[d]
                    val time = tmp.time + 1

                    if(nx < 0 || nx >= rows || ny < 0 || ny >= cols) continue

                    if(map[nx][ny] == 'D') {
                        ans = minOf(ans, time)
                        return
                    }
                    if(map[nx][ny] == '.') {
                        map[nx][ny] = 'S'
                        queue.offer(Point(nx, ny, time))
                    }
                }
            }
        }
    }

    for(i in 0 until rows) {
        for(j in 0 until cols) {
            if(map[i][j] == 'S') {
                queue.offer(Point(i, j, 0))
            } else if(map[i][j] == '*') {
                water.offer(Point(i, j, 0))
            }
        }
    }

    bfs()

    bw.write(if(ans == Int.MAX_VALUE) "KAKTUS" else "$ans")
    bw.flush()
    bw.close()
    br.close()
}

 

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

[백준] 2047번: 두 용액 - Kotlin[코틀린]  (1) 2024.01.14
[백준] 2018번: 수들의 합 5 - Kotlin[코틀린]  (0) 2024.01.13
[백준] 3273번: 두 수의 합 - Kotlin[코틀린]  (0) 2024.01.11
[백준] 1850번: 최대공약수 - Kotlin[코틀린]  (0) 2024.01.07
[백준] 1652번: 누울 자리를 찾아라 - Kotlin[코틀린]  (0) 2024.01.04
'알고리즘/Baekjoon' 카테고리의 다른 글
  • [백준] 2047번: 두 용액 - Kotlin[코틀린]
  • [백준] 2018번: 수들의 합 5 - Kotlin[코틀린]
  • [백준] 3273번: 두 수의 합 - Kotlin[코틀린]
  • [백준] 1850번: 최대공약수 - Kotlin[코틀린]
junghoooooon
junghoooooon
  • junghoooooon
    코드팁스
    junghoooooon
  • 전체
    오늘
    어제
    • 전체 (120)
      • 안드로이드 (0)
        • 코드팁스 (0)
      • 유니티 (0)
        • 코드팁스 (0)
      • 알고리즘 (118)
        • 알고리즘 (0)
        • Baekjoon (118)
      • GitHub (0)
      • 티스토리 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

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

    티스토리툴바