はじめに
Paizaの練習問題のひとつに、「長テーブルのうなぎ屋」という設問があります。
Paizaの練習問題はスキルチェックとは違い解答を含む投稿が認められており、qiitaにも投稿している方が何名かおられます。
執筆日現在、Kotlinで解いた内容を投稿している方がおらず、Paiza公式の模範解答にKotlinでの解答が含まれていません。
そこで、この記事ではKotlinで「長テーブルのうなぎ屋」を解いた際の解答例のひとつとして私の解答を記載します。
なお、私はいわゆる競技プログラミングをしておらず、比較的通常業務に近いコードの書き方をしていることをご了承ください。
回答例
private var seats: MutableList<Boolean> = mutableListOf() //true:着席済 false:空席
fun main() {
val (numberOfSeats, numberOfGroups) = inputPair()
seats = MutableList(numberOfSeats) { false }
(1..numberOfGroups).map {
visit()
}
export()
}
private fun visit() {
val (numberOfPeople, seatStartRaw) = inputPair()
val rangeStart = seatStartRaw - 1 //リストの添字は0から始まるため1ひく
val rangeEnd = rangeStart + numberOfPeople - 1 //リストの添字は0から始まるため1ひく
val isBooked = getIsRangeBooked(rangeStart, rangeEnd)
if (!isBooked) {
bookRange(rangeStart, rangeEnd)
}
}
private fun getIsRangeBooked(rangeStart: Int, rangeEnd: Int): Boolean {
return (rangeStart..rangeEnd).any { i -> getIsSeatBooked(i) }
}
private fun getIsSeatBooked(seat: Int): Boolean {
if (seat >= seats.count()) {
return getIsSeatBooked(seat - seats.count())
}
return seats[seat]
}
private fun bookRange(seatStart: Int, seatEnd: Int) {
(seatStart..(seatEnd)).map { i -> bookSeat(i) }
}
private fun bookSeat(seat: Int) {
if (seat >= seats.count()) {
bookSeat(seat - seats.count())
return
}
seats[seat] = true
}
private fun export() {
println(seats.count { s -> s })
}
private fun inputPair(): Pair<Int, Int> {
val input = readln().split("\\s".toRegex())
val firstVal = input[0].toInt()
val secondVal = input[1].toInt()
return Pair(firstVal, secondVal)
}
感想・ご指摘などあれば後学のためにお寄せいただけますと幸いです。