Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- GAN
- 백준
- cim
- 현대자동차
- 스마트팩토리
- heapq
- 그리디
- 파이썬
- Python
- 소프티어
- 자바
- MES
- softeer
- 딥러닝
- 탐욕법
- programmers
- 힙큐
- Algorithm
- 토이프로젝트
- cs공부
- JavaScript
- 비전공자
- 알고리즘
- 자바스크립트
- Baekjoon
- alogorithm
- Java
- 프로그래머스
- re_lunchu
- 현대
Archives
- Today
- Total
eaz_coding
[Programmers] 연속된 부분 수열의 합 본문
문제
요약
수열에서 부분 수열의 합이 k와 같은 가장 짧은 구간, 짧은 구간이 여러개라면 가장 앞의 구간을 구해라.
원본
https://school.programmers.co.kr/learn/courses/30/lessons/178870
풀이
풀이1(시간초과)
처음 생각한 풀이는 구간의 시작지점과 끝지점을
구간의 합이 k보다 클 경우, 같을 경우, 적을 경우로 구분해서 옮겨가는 것이다.
아쉽게도 테케 8개만 통과하고 시간초과가 발생한다.
시간복잡도 최악의 경우가 n^2 인가 보다.
def solution(sequence, k):
s, e = 0, len(sequence)-1
i, j = 0, 0
while i < len(sequence) and j < len(sequence):
t = sum(sequence[i:j+1])
if t > k:
i += 1
elif t == k:
if j - i < e-s:
s, e = i, j
j += 1
else:
j += 1
return [s,e]
풀이2
시작 지점을 한바퀴 도는 것은 같으니까 for문으로 순회하면서 비교했다.
처음에 합과 끝지점인 m, e를 for문 안에서 정의해서 i부터 다시 비교했는데 그러면 똑같이 반복하게 되니까
시작지점을 옮겼을 때, 합했던 값에서 시작지점 값을 빼줬다.
def solution(sequence, k):
n = len(sequence)
m, e, l = 0, 0, n
for i in range(n):
while m < k and e < n:
m += sequence[e]
e += 1
if m == k and l > e-1-i:
answer = [i, e-1]
l = e-1-i
m -= sequence[i]
return answer
'eaz_algorithm' 카테고리의 다른 글
[Programmers] 숫자 카드 나누기(Python, JavaScript) (0) | 2024.05.29 |
---|---|
[Programmers] 호텔 대실 (0) | 2024.05.27 |
[Programmers] 큰 수 만들기 (0) | 2024.05.23 |
[Programmers] 숫자 변환하기 (0) | 2024.05.17 |
[Programmers] 프렌즈4블록 (0) | 2024.05.16 |