Kotlin/Kotlin 알고리즘

백준 14888번 연산자 끼워넣기 Kotlin 구현해보기

kimc 2023. 3. 10. 00:23

```

백준 14888번 연산자 끼워넣기 Kotlin 구현해 보기

```

Kimc Kotlin Study

이번 글을 통해 배워갈 내용

  1. 백준 14888번 풀이

https://www.acmicpc.net/problem/14888

 

14888번: 연산자 끼워넣기

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 

www.acmicpc.net

 

 

백준 14888번 연산자 끼워넣기는 난이도 실버문제로서

수의 개수

해당되는 수의 개수만큼의 수들

연산자의 종류와 개수들이 주어질 때

해당되는 연산자와 수들을 조합해서 만들 수 있는 가장 큰 수와 작은 수를 구해주면 되는 문제입니다.

 


30분 정도 위에 링크를 방문하셔서 풀어보시고

안 풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.


입력을 받고

재귀함수를 만들어서

재귀함수만큼 Bruteforce로 돌게 해서 풀었습니다.

 

import java.lang.Integer.min
import kotlin.math.max

fun main(args: Array<String>) {
    // input
    val inputDto = getInput()
    // output
    print(solution(inputDto))
}

data class InputDto(
    val lineCnt: Int,
    val nums: List<Int>,
    var addCnt: Int,
    var subCnt: Int,
    var mulCnt: Int,
    var divCnt: Int,
    var minV: Int = Int.MAX_VALUE,
    var maxV: Int = Int.MIN_VALUE,
) {
    fun dfs(idx: Int, v: Int) {
        if (idx == lineCnt) {
            minV = min(minV, v)
            maxV = max(maxV, v)
        } else {
            if (addCnt > 0) {
                addCnt--
                dfs(idx + 1, v + nums[idx])
                addCnt++
            }
            if (subCnt > 0) {
                subCnt--
                dfs(idx + 1, v - nums[idx])
                subCnt++
            }
            if (mulCnt > 0) {
                mulCnt--
                dfs(idx + 1, v * nums[idx])
                mulCnt++
            }
            if (divCnt > 0) {
                divCnt--
                dfs(idx + 1, v / nums[idx])
                divCnt++
            }
        }
    }

}

fun getInput(): InputDto {
    val lineCnt = readln().toInt()
    val nums = readln().split(" ").map { k -> k.toInt() }
    val ops = readln().split(" ").map { k -> k.toInt() }
    val addCnt = ops[0]
    val subCnt = ops[1]
    val mulCnt = ops[2]
    val divCnt = ops[3]
    return InputDto(lineCnt, nums, addCnt, subCnt, mulCnt, divCnt)
}


fun solution(dto: InputDto): String {
    dto.dfs(1, dto.nums[0])
    return "${dto.maxV}\n${dto.minV}"
}


// https://codemasterkimc.tistory.com/

 

테스트

import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test

internal class MainKtTest {

    @Test
    fun test() {
        assertEquals(
            "30\n30",
            solution(
                InputDto(
                    lineCnt = 2,
                    nums = listOf(5, 6),
                    addCnt = 0,
                    subCnt = 0,
                    mulCnt = 1,
                    divCnt = 0,
                    minV = 2147483647,
                    maxV = -2147483648
                )
            )
        )
    }
}

 

 

 

읽어주셔서 감사합니다

 

무엇인가 얻어가셨기를 바라며

 

오늘도 즐거운 코딩 하시길 바랍니다 ~ :)

 


 

728x90