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
- boj
- 현대자동차
- 알고리즘
- Python
- Java
- alogorithm
- 탐욕법
- heapq
- cs공부
- softeer
- 힙큐
- 딥러닝
- re_lunchu
- 오블완
- 자바스크립트
- Algorithm
- 파이썬
- 토이프로젝트
- programmers
- Baekjoon
- 자바
- 프로그래머스
- 현대
- GAN
- 소프티어
- 스마트팩토리
- 백준
- JavaScript
- 티스토리챌린지
- cim
Archives
- Today
- Total
eaz_coding
[Programmers] 연속된 부분 수열의 합 본문
문제
요약
수열에서 부분 수열의 합이 k와 같은 가장 짧은 구간, 짧은 구간이 여러개라면 가장 앞의 구간을 구해라.
원본
https://school.programmers.co.kr/learn/courses/30/lessons/178870
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
풀이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 |