-
[프로그래머스][Kotlin]연속 펄스 부분 수열의 합프로그래머스 2023. 4. 11. 14:55728x90
해당 문제는 연속 펄스 부분 수열의 합 중 가장 큰 값을 return 하는 문제입니다.
저는 처음에는 세크먼트트리를 연습할 겸해서 시간 초과가 발생할 것 같은 제한조건 이였지만, 세그먼트트리를 이용하여 펄스 수열이 1,-1 로 시작되는 케이스에 따라 2개를 만들어 갱신 및 조회 하는 방법으로 사용하였고, 그렇게 시간 초과가 발생하여 실패 하였습니다. 세크먼트트리로 작성 시 제가 연습이 부족하여 그런 것일 수도 있음을 말씀드립니다. 맘같아서는 연습했던 코드도 같이 올리고 싶지만 실수로 날려버려 하기에는 통과한 코드만 있습니다.
-----잡설
-----본문
해당 문제는 부분 합이 가장 큰 값을 리턴하는 것인데 생각해보면 가장 큰 값을 예상해보면 음수들을 더하는 것이 아닌 양수들의 합임을 알 수 있습니다. 다만 예를 들어 펄스 수열을 진행하여 1,2,3,4,-5,6 이라는 배열을 확인 할 때
양수들만 확인할 경우 최대 값은 1+2+3+4 = 10 이 나옵니다. 하지만 모든 수를 더했을 경우 1+2+3+4-5+6 = 11 이 나옵니다. 음수가 나오더라도 뒤에 그 음수 값보다 큰 값이 있으면 최대값이 늘어 나는 점을 확인 할 수 있습니다.
그렇다면 -5가 아닌 -11 일 경우 에는 1~4까지의 합이 최대 값인 것을 확인 할 수 있습니다.
그러면 합을 저장해두다가 합이 음수가 될 경우 뒤에 더 큰 숫자가 오더라도 최대 값이 될 수 없기 때문에 그 전까지의 합들을 비교하면서 answer에 최대값을 저장하며 비교를 한다면 올바른 최대 값이 나올 거라고 생각 할 수 있습니다.
이 경우 배열의 크기만큼 한번 반복하기에 O(N) 만큼의 시간 복잡도를 가지어 시간초과가 발생하지 않음을 예상할 수 있어 바로 코드로 작성하였습니다.
하기는 제가 작성한 코드와 실행 결과 입니다.
class Solution { fun solution(sequence: IntArray): Long { var answer: Long = 0 var arr1 = LongArray(sequence.size){0L} var arr2 = LongArray(sequence.size){0L} var reverse = 1 for(i in 0 .. sequence.size-1){ arr1[i] = (sequence[i]*reverse).toLong() arr2[i] = (sequence[i]*reverse*-1).toLong() reverse *= -1 } var temp = 0L var temp2 = 0L for(i in 0 .. sequence.size-1){ temp += arr1[i] temp2 += arr2[i] if(temp < 0)temp = 0 if(temp2 < 0)temp2 = 0 answer = Math.max(answer,Math.max(temp,temp2)) } return answer } }
테스트 1 〉 통과 (0.10ms, 59.2MB) 테스트 2 〉 통과 (0.05ms, 60.9MB) 테스트 3 〉 통과 (0.09ms, 59.3MB) 테스트 4 〉 통과 (0.08ms, 62.1MB) 테스트 5 〉 통과 (0.07ms, 61.2MB) 테스트 6 〉 통과 (0.08ms, 61.5MB) 테스트 7 〉 통과 (0.08ms, 62.5MB) 테스트 8 〉 통과 (0.26ms, 60.8MB) 테스트 9 〉 통과 (0.40ms, 60.4MB) 테스트 10 〉 통과 (0.82ms, 59.9MB) 테스트 11 〉 통과 (1.49ms, 61.4MB) 테스트 12 〉 통과 (4.89ms, 65.3MB) 테스트 13 〉 통과 (6.27ms, 66.9MB) 테스트 14 〉 통과 (7.95ms, 66.2MB) 테스트 15 〉 통과 (8.79ms, 67.2MB) 테스트 16 〉 통과 (4.54ms, 66.1MB) 테스트 17 〉 통과 (22.05ms, 103MB) 테스트 18 〉 통과 (19.46ms, 105MB) 테스트 19 〉 통과 (21.93ms, 103MB) 테스트 20 〉 통과 (17.96ms, 103MB) '프로그래머스' 카테고리의 다른 글
[프로그래머스][Kotlin]가장 먼 노드 (0) 2023.04.12 [프로그래머스][Kotlin]겹치는 선분의 길이 (0) 2023.04.12 [프로그래머스][Kotlin]달리기 경주 (0) 2023.04.07 [프로그래머스][Kotlin]연속된 부분 수열의 합 (0) 2023.04.07 [프로그래머스][Kotlin] 과제 진행하기 (0) 2023.04.03