본문 바로가기

알고리즘(w.KOTLIN)/그리디(Greedy)

[백준][코틀린][1744] 수 묶기

728x90

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

 

1744번: 수 묶기

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에

www.acmicpc.net

문제 풀이

1. 입력을 sequence int 배열에 저장한다.

2. sequence 배열을 내림 차순으로 정렬 한다.

3. 양수에 대해서 index 를 0부터 시작하여 두 수의 곱이 두 수의 합보다 크면 result 에 저장하고 index 를 2 증가 시킨다.

4. 두 수의 합이 더 크면 result 에 현재 index 의 값을 저장하고 index 를 1 증가 시킨다.

5. 음수에 대해서 index 를 N-1 부터 시작하여 두 수의 곱이 두 수의 합보다 크면 result 에 저장하고 index 를 2 감소 시킨다.

6. 두 수의 합이 더 크면 result 에 현재 index 의 값을 저장하고 index 를 1 감소 시킨다.

7. result 를 출력한다.

코드

import java.io.*

fun main(args: Array<String>) {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val N = br.readLine().toInt()

    val sequence = IntArray(N) { 0 }

    repeat(N) {
        val num = br.readLine().toInt()
        sequence[it] = num
    }

    // 내림 차순으로 정렬 한다.
    sequence.sortDescending()

    /*for (seq in sequence) {
        print("$seq ")
    }
    println()*/

    // 양수를 계산 한다.
    var index = 0
    var result = 0

    while (index < N && sequence[index] > 0) {
        if (index == N - 1) {
            result += sequence[index]
            index++
        } else {
            if (sequence[index] * sequence[index + 1] > sequence[index] + sequence[index + 1]) {
                result += sequence[index] * sequence[index + 1]
                index += 2
            } else {
                result += sequence[index]
                index += 1
            }
        }
    }

    // 음수를 계산한다. 음수를 마지막 index 부터 두 수를 묶는다.
    index = N - 1

    while (index >= 0 && sequence[index] < 0) {
        if (index == 0) {
            result += sequence[index]
            index--
        } else {
            if (sequence[index] * sequence[index - 1] > sequence[index] + sequence[index - 1]) {
                result += sequence[index] * sequence[index - 1]
                index -= 2
            } else {
                result += sequence[index]
                index -= 1
            }
        }
    }

    println(result)
}
728x90