[백준] 7576번: 토마토 - Kotlin[코틀린]

2023. 9. 27. 04:13·알고리즘/Baekjoon

문제

 

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

 


풀이

 

 토마토가 익는 과정은 동시에 일어나기 때문에 Queue를 이용한 BFS(너비 우선 탐색)으로 해결할 수 있다.

 

 배열을 입력 받아 익은 토마토(1)인 경우에는 Queue에 추가해준다. 익지 않은 토마토(0)인 경우에는 익지 않은 토마토의 개수를 확인하는 변수인 cnt를 증가시켜준다. 

 

 이제 BFS를 실행하면 된다. 큐에서 하나의 위치를 꺼내어 상하좌우를 탐색하며 익지 않은 토마토(0)를 만나게 되면 cnt를 1 감소시키고 배열에 현재 날짜 + 1을 대입 시켜준다. 탐색이 끝났을 때, cnt가 0이라면 모든 토마토가 익었으므로 최소 일수를 출력한다. 그렇지 않다면 모든 토마토가 익지 못하는 상황 -1을 출력한다.

 


코드

 

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)

    var st = StringTokenizer(br.readLine())
    val (cols, rows) = arrayOf(st.nextToken().toInt(), st.nextToken().toInt())
    val arr = Array(rows) { IntArray(cols) }
    val queue : Queue<Point> = LinkedList()
    var cnt = 0 // 익지 않은 토마토의 개수

    for (i in 0 until rows) {
        st = StringTokenizer(br.readLine())
        for (j in 0 until cols) {
            arr[i][j] = st.nextToken().toInt()

            when (arr[i][j]) { // 익은 토마토는 큐에 추가, 익지 않은 토마토는 개수 증가
                1 -> queue.add(Point(i, j))
                0 -> cnt++
            }
        }
    }

    fun bfs() : Int {
        var day = 0

        while(queue.isNotEmpty()) {
            val (tx, ty) = queue.poll()
            day = arr[tx][ty]

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

                if(nx<0||ny<0||nx>=rows||ny>=cols) continue
                if(arr[nx][ny]!=0) continue

                cnt--
                queue.add(Point(nx, ny))
                arr[nx][ny] = day + 1
            }
        }

        return if(cnt == 0) day - 1
        else -1 // 익지 않은 토마토가 남아 있는 경우
    }

    bw.write("${bfs()}")
    bw.flush()
    bw.close()
    br.close()
}

 

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

[백준] 15649번: N과 M (1) - Kotlin[코틀린]  (0) 2023.09.28
[백준] 1890번: 점프 - Kotlin[코틀린]  (0) 2023.09.27
[백준] 1904번: 01타일 - Kotlin[코틀린]  (0) 2023.09.26
[백준] 10971번: 외판원 순회 2 - Kotlin[코틀린]  (0) 2023.09.24
[백준] 1931번: 회의실 배정 - Kotlin[코틀린]  (0) 2023.09.23
'알고리즘/Baekjoon' 카테고리의 다른 글
  • [백준] 15649번: N과 M (1) - Kotlin[코틀린]
  • [백준] 1890번: 점프 - Kotlin[코틀린]
  • [백준] 1904번: 01타일 - Kotlin[코틀린]
  • [백준] 10971번: 외판원 순회 2 - Kotlin[코틀린]
junghoooooon
junghoooooon
  • junghoooooon
    코드팁스
    junghoooooon
  • 전체
    오늘
    어제
    • 전체 (120)
      • 안드로이드 (0)
        • 코드팁스 (0)
      • 유니티 (0)
        • 코드팁스 (0)
      • 알고리즘 (118)
        • 알고리즘 (0)
        • Baekjoon (118)
      • GitHub (0)
      • 티스토리 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

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

    티스토리툴바