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
'알고리즘(w.KOTLIN) > 그리디(Greedy)' 카테고리의 다른 글
[백준][코틀린][10610] 30 (0) | 2023.05.19 |
---|---|
[백준][코틀린][2875] 대회 or 인턴 (0) | 2023.05.18 |
[백준][코틀린][1541] 잃어버린 괄호 (0) | 2023.05.11 |
[백준][코틀린][12015] 가장 긴 증가하는 부분 수열2 (0) | 2023.05.11 |
[백준][코틀린][2109] 순회강연 (0) | 2023.05.09 |