[백준] 2636번: 치즈 - Kotlin[코틀린]

2023. 10. 27. 17:23·알고리즘/Baekjoon

문제

 

 

2636번: 치즈

아래 <그림 1>과 같이 정사각형 칸들로 이루어진 사각형 모양의 판이 있고, 그 위에 얇은 치즈(회색으로 표시된 부분)가 놓여 있다. 판의 가장자리(<그림 1>에서 네모 칸에 X친 부분)에는 치즈가 놓

www.acmicpc.net

 


풀이

 

 BFS를 활용해 풀이하면 된다. 먼저 입력을 받고 치즈의 총량을 확인해준다. while문 반복을 통해 치즈가 없어 질 때까지 BFS 함수를 실행한다. 공기와 접촉되어 있는 치즈를 확인하기 위해  Queue에 공기를 담아가며 탐색하고 치즈를 만나면 체크해준다. 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 (rows, cols) = br.readLine().split(' ').map { it.toInt() }
    val map = Array(rows) { IntArray(cols) }
    var cheese = 0 // 치즈의 총량

    for(i in 0 until rows) {
        val st = StringTokenizer(br.readLine())
        for(j in 0 until cols) {
            map[i][j] = st.nextToken().toInt()
            if(map[i][j] == 1) cheese++
        }
    }

    fun meltCheese() { // 치즈 녹이는 함수
        for(i in 0 until rows) {
            for(j in 0 until cols) {
                if(map[i][j] == 2) {
                    map[i][j] = 0
                    cheese--
                }
            }
        }
    }

    fun bfs(p: Point) {
        val visited = Array(rows){ BooleanArray(cols) }
        val queue : Queue<Point> = LinkedList()

        visited[p.x][p.y] = true
        queue.offer(p)

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

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

                if(nx < 0 || ny < 0 || nx >= rows || ny >= cols) continue
                if(visited[nx][ny]) continue
                visited[nx][ny] = true

                if(map[nx][ny] == 1) {
                    map[nx][ny] = 2
                } else {
                    queue.add(Point(nx, ny))
                }
            }
        }
    }

    var time = 0
    var leftover = 0

    while (cheese!=0) {
        time++
        bfs(Point(0, 0))
        leftover = cheese
        meltCheese()
    }

    bw.write("$time\n$leftover")
    bw.flush()
    bw.close()
    br.close()
}

 

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

[백준] 1922번: 네트워크 연결 - Kotlin[코틀린]  (0) 2023.11.01
[백준] 1717번: 집합의 표현 - Kotlin[코틀린]  (0) 2023.10.31
[백준] 1871번: 스택 수열 - Kotlin[코틀린]  (0) 2023.10.26
[백준] 2164번: 카드2 - Kotlin[코틀린]  (0) 2023.10.25
[백준] 2161번: 카드1 - Kotlin[코틀린]  (0) 2023.10.24
'알고리즘/Baekjoon' 카테고리의 다른 글
  • [백준] 1922번: 네트워크 연결 - Kotlin[코틀린]
  • [백준] 1717번: 집합의 표현 - Kotlin[코틀린]
  • [백준] 1871번: 스택 수열 - Kotlin[코틀린]
  • [백준] 2164번: 카드2 - Kotlin[코틀린]
junghoooooon
junghoooooon
  • junghoooooon
    코드팁스
    junghoooooon
  • 전체
    오늘
    어제
    • 전체 (120)
      • 안드로이드 (0)
        • 코드팁스 (0)
      • 유니티 (0)
        • 코드팁스 (0)
      • 알고리즘 (118)
        • 알고리즘 (0)
        • Baekjoon (118)
      • GitHub (0)
      • 티스토리 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

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

    티스토리툴바