728x90
https://school.programmers.co.kr/learn/courses/30/lessons/134239
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이
1. 입력의 초항(k) 가 1이 되는 과정인 우박수열을 저장하는 arr 배열선언하고 주어진 조건에 따라 값을 저장한다.
2. 각 구간의 사다리꼴 면적을 구해 area 배열에 저장한다.
3. 구간 합을 sum 배열에 저장한다. 구간 합 알고리즘 => sum[i] = sum[i - 1] + area[i]
4. ranges 배열을 탐색하여 a, b 값을 찾고 start, end 값을 구한다.
start = a / end = (1번 arr 배열 크기 - 1) + b => 1번 arr 배열의 크기 - 1 이 마지막 좌표가 되기 때문에...
5. 구간합 sum 배열을 이용하여 결과를 answer 에 저장한다. 이때 4번에서 구한 start 가 end 보다 크면 -1.0 을 answer 에 바로 저장한다. 그외에는 sum[end] - sum[start] 값을 answer 에 저장한다.
코드
class Solution {
fun solution(k: Int, ranges: Array<IntArray>): DoubleArray {
val answer = mutableListOf<Double>()
// 우발 수열 저장하는 리스트.
val arr = mutableListOf<Int>()
arr.add(k)
var next = k
while (next != 1) {
if (next % 2 == 0) next /= 2
else next = next * 3 + 1
arr.add(next)
}
// 각 구간의 넓이를 저장하는 area 배열
val area = DoubleArray(arr.size) {
0.0
}
for (i in 1 until arr.size) {
area[i] = (arr[i] + arr[i - 1]) / 2.toDouble()
//println("area[$i]=${area[i]}")
}
// 구간 합을 저장하는 sum 배열
val sum = DoubleArray(arr.size) {
0.0
}
for (i in 1 until arr.size) {
sum[i] = sum[i - 1] + area[i]
}
ranges.forEach { range ->
val a = range[0]
val b = (arr.size - 1) + range[1]
//println("$a, $b = ${area[b]}, ${area[a]}")
if (a > b) answer.add(-1.0)
else {
answer.add(sum[b] - sum[a])
}
}
return answer.toDoubleArray()
}
}
728x90
'알고리즘(w.KOTLIN) > 구간 합' 카테고리의 다른 글
[알고리즘][KOTLIN] 구간 합 (0) | 2022.11.10 |
---|