2024. 6. 9. 03:25ㆍ프로그래머스/Kotlin | Level2
Lv2 - 연속된 부분 수열의 합
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 해석
연속된 부분 수열의 합이 문제에서 제안한 k의 값과 일치하는 경우를 찾아야한다.
가장 짧은 부분 수열을 찾되, 길이가 같은 경우 앞선 부분 수열이 우선이다.
첫번째 index와 두번째 index를 리턴하면 끝
풀이 방법
풀이 접근 과정
index0부터 시작해서 부분수열을 하나하나 만들어볼까…)
처음엔 완전 탐색으로 모든 부분 수열의 합을 만들어서 돌렸더니 역시나 시간 초과가 나왔다.
그래서 예전에 사용했던 누적합을 이용해볼까 하다가 이것도 반복문이 깊게 들어갈 것 같아 고민이 되었다.
그러다가 투포인터 알고리즘이 떠올라 그 방법으로 풀어보기로 도전 !!
최종 소스코드
class Solution {
fun solution(sequence: IntArray, k: Int): IntArray {
var answer: IntArray = intArrayOf(1000000, 2000000)
var start = 0
var sum = 0
fun setAnswer(index: Int) {
val minLength = answer[1] - answer[0]
val length = index - start
if (length < minLength || (start < answer[0] && length == minLength)) {
answer = intArrayOf(start, index)
}
}
sequence.forEachIndexed { index, i ->
sum += i
if (sum == k) {
setAnswer(index)
} else {
while (start <= index && sum > k) {
sum -= sequence[start++]
if (sum == k) {
setAnswer(index)
}
}
}
}
return answer
}
}
sequnce length 는 1000000 이므로 answer의 시작값을 1000000 으로 놓고 시작한다.
length 범위도 1000000 로 주기 위해 end 값을 2000000으로 줬다.
start 기본 값을 0으로 두고 end를 조율해가며 부분 수열의 합을 구하다가,
부분 수열의 합이 k보다 커지면 start가 end와 같아지는 시점까지 start를 옮긴다.
만약 부분 수열의 합이 k 값과 같으면, 수열의 길이와 시작 위치를 비교하여 answer를 바꿔준다.
Comment
처음에 접근을 빙빙 돌려가며 했다.
좀 더 간단하게 접근하면 금방 풀릴 것 같은데 접근이 제대로 떠오르지 않아 애먹었던 문제이다.
한~~참 방치하고 놀다가 집 와서 다시 푸니 떠오른 투포인터 알고리즘 !!
접근만 제대로 하니 문제는 금방 풀렸다.
'프로그래머스 > Kotlin | Level2' 카테고리의 다른 글
[프로그래머스/Kotlin]Lv2 - 점 찍기 (0) | 2024.07.04 |
---|---|
[프로그래머스/Kotlin]Lv2 - 뒤에 있는 큰 수 찾기 (0) | 2024.07.01 |
[프로그래머스/Kotlin]Lv2 - N-Queen (1) | 2024.06.06 |
[프로그래머스/Kotlin]Lv2 - 과제 제출하기 (0) | 2024.04.13 |
[프로그래머스/Kotlin]Lv2 - 마법의 엘리베이터 (0) | 2024.03.21 |