Menu
Coddy logo textTech

재고 부족 알림

Coddy Kotlin 여정의 논리와 흐름 섹션에 포함된 레슨. 63개 중 60번째.

challenge icon

챌린지

어려움

매개변수 commands: List<String>를 사용하여 runInventory를 완성하세요. 각 함수 호출마다 비어 있는 상태로 시작하는 재고를 만드세요. 각 명령은 필드가 |로 구분된 하나의 문자열입니다. 품목 이름은 소문자 ASCII 단어입니다. 명령은 최대 100개입니다. 각 명령을 리터럴 구분자로 나누세요. 명령에는 해당 연산에 맞는 올바른 수의 필드가 항상 포함되어 있습니다. 명령마다 하나의 응답을 반환하세요. 수량은 파싱하기 전에 공백을 제거합니다. 유효한 수량은 0에서 1000 사이입니다. 잘못된 숫자 텍스트, Int 범위를 벗어난 텍스트, 음수 수량 또는 1000을 초과하는 수량은 상태를 변경하지 않고 invalid를 생성합니다. 이전 단계에서 작성한 모든 내용, 즉 이전의 모든 명령과 응답을 그대로 유지하세요. ADD|item|quantity를 지원하세요. 유효한 수량을 해당 품목의 재고에 더하고, 재고가 처음에는 0이 되도록 하며, added를 응답하세요. 0을 추가해도 해당 품목은 생성됩니다. GET|item을 추가하세요. 해당 품목의 수량을 문자열로 응답하고, 품목이 없으면 0을 응답하세요. SELL|item|quantity를 추가하세요. 먼저 ADD와 동일한 규칙으로 수량을 검증하세요. 유효한 수량인 경우, 재고가 부족하면 insufficient를 응답하고, 그렇지 않으면 해당 수량을 차감한 뒤 sold를 응답하세요. 존재하지 않는 품목의 사용 가능한 재고는 0입니다. 0을 판매해도 없는 품목이 생성되지는 않습니다. 재고가 0인 기존 품목은 유지하세요. REPORT를 추가하세요. 저장된 모든 항목을 item=quantity 형식으로 응답하되, ;로 구분하고 품목을 알파벳순으로 정렬하세요. 재고가 0인 항목도 포함하세요. 빈 재고는 empty를 생성합니다. REPORT에는 인수 필드가 없습니다. LOW|threshold를 추가하세요. 수량과 동일한 숫자 규칙으로 임계값을 검증하세요. 잘못된 입력에는 invalid를 응답하세요. 그렇지 않으면 수량이 임계값보다 엄격하게 작은 저장된 품목 이름을 알파벳순으로 정렬하고 ;로 구분하여 응답하세요. 해당하는 항목이 없으면 none을 응답하세요. LOW는 재고를 변경하지 않습니다. 입력에는 이 단계에서 지원되는 연산만 사용됩니다.

위에서 더 엄격한 범위를 지정하지 않은 경우, 각 수준의 컬렉션에는 최대 100개의 요소가 포함되며 정수 인수와 정수 컬렉션 값의 범위는 -1000에서 1000 사이입니다. 파싱을 위해 제공되는 텍스트에는 설명된 것처럼 잘못된 표현이나 범위를 벗어난 표현이 포함될 수 있습니다.

List<String> 타입의 값을 반환하세요. 제공된 입력/출력 코드를 그대로 유지하세요. 스칼라 인수는 한 줄에 하나씩 읽고, 리스트는 개수에 이어 각 요소가 나오며, 맵은 항목 개수에 이어 각 키와 값이 나오는 형식입니다. 중첩 리스트에서는 각 행마다 개수와 요소 형식을 반복합니다. 제공된 main은 반환값을 출력한 다음 줄바꿈 하나를 출력합니다. 리스트는 Kotlin의 표준 대괄호 형식을 사용합니다. 추가 레이블은 출력하지 마세요.

직접 해보기

fun runInventory(commands: List<String>): List<String> {
    val stock = mutableMapOf<String, Int>()
    val replies = mutableListOf<String>()
    for (command in commands) {
        val parts = command.split("|")
        val operation = parts[0]
        val item = if (parts.size > 1) parts[1] else ""
        when (operation) {
            "ADD" -> {
                val amount = parts[2].trim().toIntOrNull()
                if (amount == null || amount !in 0..1000) replies.add("invalid")
                else {
                    stock[item] = (stock[item] ?: 0) + amount
                    replies.add("added")
                }
            }
            "GET" -> replies.add((stock[item] ?: 0).toString())
            "SELL" -> {
                val amount = parts[2].trim().toIntOrNull()
                val available = stock[item] ?: 0
                if (amount == null || amount !in 0..1000) replies.add("invalid")
                else if (amount > available) replies.add("insufficient")
                else {
                    if (stock.containsKey(item)) stock[item] = available - amount
                    replies.add("sold")
                }
            }
            "REPORT" -> {
                if (stock.isEmpty()) replies.add("empty")
                else replies.add(stock.keys.sorted().map { "$it=${stock[it]}" }.joinToString(";"))
            }
        }
    }
    return replies
}
fun main() {
    val commandsCount = readln().toInt()
    val commands = mutableListOf<String>()
    for (i0 in 0 until commandsCount) {
        val commandsItem = readLine().orEmpty()
        commands.add(commandsItem)
    }
    println(runInventory(commands))
}

논리와 흐름의 모든 레슨

직접 연습해 보세요: Kotlin 플레이그라운드