백준 10836번
https://www.acmicpc.net/problem/10836
문제자체는 어렵지 않은 구현문제이다
4번에서 계속 시간초과가 나왔는데, 최적화를 생각해야 한다.
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
많은 도움이 되었습니다, 감사합니다.