Kotlin/Kotlin 알고리즘

백준 2470번 두 용액 Kotlin 구현해보기

kimc 2023. 3. 15. 22:55

```

백준 2470번 두 용액 Kotlin 구현해 보기

```

Kimc Kotlin Study

이번 글을 통해 배워갈 내용

  1. 백준 2470번 풀이

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

 

2470번: 두 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00

www.acmicpc.net

백준 2470번 두용액은

난이도 골드 등급의 문제로서

 

1부터 10억까지의 양의 정수로 표현되는 산성 용액

-1부터 -10억까지의 음의 정수로 표현되는 알칼리 용액

들이 주어지고

주어진 용액들 중에 두 개의 용액을 섞어서 0에 가까운 값을 만들어주면 되는 문제입니다.


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

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


이분탐색을 해서

0에 가까운 값을

NlogN정도의 시간복잡도로 찾았습니다

 

import kotlin.math.abs

fun main() {
    val inputDto = getInput()
    print(solution(inputDto))
}

fun getInput(): InputDto {
    val size = readln().toInt()
    val liquids = readln().split(" ").map { k -> k.toInt() }.toIntArray()
    return InputDto(liquids)
}

data class InputDto(
    var liquids: IntArray
)

fun solution(dto: InputDto): String {
    return findNeutralAcidAndAlkali(dto.liquids)
}

fun findNeutralAcidAndAlkali(liquids: IntArray): String {

    liquids.sort()
    var left = 0
    var right = liquids.size - 1
    var al = liquids[left]
    var ar = liquids[right]
    var acidity = al + ar

    while (left < right) {
        val curAcidity = liquids[left] + liquids[right]
        if (abs(acidity) > abs(curAcidity)) {
            acidity = curAcidity
            al = liquids[left]
            ar = liquids[right]
        }
        if (curAcidity <= 0) {
            left++
        } else {
            right--
        }
    }
    return "$al $ar"
}


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

 

테스트

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

internal class MainKtTest {

    @Test
    fun test() {
        assertEquals(
            "-99 98",
            solution(
                InputDto(intArrayOf(-2, 4, -99, -1, 98))
            )
        )
    }
}

 

 

읽어주셔서 감사합니다

 

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

 

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

 


 

728x90