백준 28353 여왕벌 Kotlin

: ) YOUNG·2023년 8월 3일
1

알고리즘

목록 보기
229/411
post-thumbnail

백준 10836번
https://www.acmicpc.net/problem/10836

문제




생각하기


  • 문제자체는 어렵지 않은 구현문제이다

  • 4번에서 계속 시간초과가 나왔는데, 최적화를 생각해야 한다.


동작



코드


Kotlin


import java.io.*
import java.util.*

// input
private lateinit var br: BufferedReader

// variables
private var M = 0 // 가로 세로 크기
private var N = 0 // 날짜 수

private lateinit var map: Array<IntArray>
private lateinit var growthArray: Array<IntArray>

fun main() {
    br = BufferedReader(InputStreamReader(System.`in`))
    val bw = BufferedWriter(OutputStreamWriter(System.out))

    input()

    bw.write(solve())
    bw.close()
} // End of main

private fun solve(): String {
    val sb = StringBuilder()

    // N일 동안 반복
    var idx = 0
    repeat(N) {
        firstGrowth(idx)
        idx++
    }

    // 출력
    for (i in 0 until M) {
        for (j in 0 until M) {
            if (j == 0) {
                sb.append(map[i][j]).append(' ') // 가장 왼쪽열과 가장 위쪽 행
            } else {
                sb.append(map[0][j]).append(' ') // 그 외에는 해당 열의 가장 위쪽 행 애벌래의 크기를 가진다
            }
        }
        sb.append('\n')
    }

    return sb.toString()
} // End of solve

private fun firstGrowth(idx: Int) {
    // 가장 왼쪽 열 아래 부터 가장 위쪽 행 오른쪽 끝까지 진행
    val zeroCount = growthArray[idx][0]
    val x: Int
    val y: Int

    when {
        zeroCount == M -> {
            x = 0
            y = 0
        }

        zeroCount < M -> {
            x = M - zeroCount
            y = 1
        }

        else -> {
            x = 0
            y = zeroCount - M
        }
    }


    val temp = secondGrowth(x, y, growthArray[idx][1], 1)
    secondGrowth(temp[0], temp[1], growthArray[idx][2], 2)
} // End of firstGrowth

private fun secondGrowth(x: Int, y: Int, count: Int, value: Int): Array<Int> {
    var temp = count
    var x = x
    var y = y

    while (temp-- > 0) {
        if (x > 0) {
            x -= 1
            y = 0
        } else {
            x = 0
            y += 1
        }

        map[x][y] += value
    }

    return arrayOf(x, y)
} // End of secondGrowth

private fun input() {
    var st = StringTokenizer(br.readLine())
    M = st.nextToken().toInt()
    N = st.nextToken().toInt()

    map = Array(M) { IntArray(M) { 1 } }

    growthArray = Array(N) { IntArray(3) }
    for (i in 0 until N) {
        st = StringTokenizer(br.readLine())
        growthArray[i][0] = st.nextToken().toInt()
        growthArray[i][1] = st.nextToken().toInt()
        growthArray[i][2] = st.nextToken().toInt()
    }
} // End of input

1개의 댓글

comment-user-thumbnail
2023년 8월 3일

많은 도움이 되었습니다, 감사합니다.

답글 달기