[참고자료] - https://ksb-dev.tistory.com/302
프로그래머스 - 연속된 부분 수열의 합(Java)
투포인터 문제입니다. 투포인터란, 두 가지의 포인터를 사용해 배열에서 조건과 일치하는 연속된 부분을 찾을 수 있는 방법입니다. 조건에 맞춰 서로 다른 두 가지의 포인터를 움직여야 합니다.
ksb-dev.tistory.com
위와 같은 방식으로 2개의 pivot을 생각하고 풀었다.
1. 런타임이 발생하는 코드
def solution(sequence, k):
l = len(sequence)
diff = l
answer = 0
small = 0
total = []
sum_ = 0
for pivot in range(l):
total.append(sequence[pivot])
sum_ += sequence[pivot]
if sum_ < k:
continue
while (1):
if sum_ < k:
break
elif sum_ > k:
sum_ -= total.pop(0)
small += 1
continue
else:
if pivot-small < diff:
answer = [small, pivot]
diff = pivot - small
break
break
return answer
2.개선된 코드
def solution(sequence, k):
l = len(sequence)
diff = l # 초기화할 때 리스트의 길이로 설정
answer = []
small = 0
sum_ = 0
for pivot in range(l):
sum_ += sequence[pivot]
while sum_ > k and small <= pivot:
sum_ -= sequence[small]
small += 1
if sum_ == k:
if pivot - small < diff:
answer = [small, pivot]
diff = pivot - small
return answer
가장 큰 차이점은 1번에서는 small이라고 가장 첫 시작 pivot과, total이라는 list에서 계속 값을 유지하고 있었다는 점이 가장 큰 잘 못된 점이었다.
small을 이용하여, pop대신 -sequene[small] 대체하여 불필요한 리스트, 연산을 제거했다.
그다음, while 조건문 생성이다. if-elif-else문 구조에서 while 조건문 하나로 간단하게 원소를 줄여야할 경우를 걸러낼 수 있었다.
'알고리즘 배우기' 카테고리의 다른 글
[프로그래머스] Lv 3. 베스트앨범 (0) | 2024.08.20 |
---|---|
[프로그래머스] Lv 2. 두 원 사이의 정수 쌍 (0) | 2024.08.18 |
[프로그래머스] Lv 2. 전력망을 둘로 나누기 (0) | 2024.08.17 |
[프로그래머스] Lv 3. 정수 삼각형 (0) | 2024.07.20 |
[프로그래머스] Lv 2. 게임 맵 최단거리 (0) | 2024.07.19 |