문제:
비내림차순으로 정렬된 수열이 주어질 때, 다음 조건을 만족하는 부분 수열을 찾으려고 합니다.
기존 수열에서 임의의 두 인덱스의 원소와 그 사이의 원소를 모두 포함하는 부분 수열이어야 합니다.부분 수열의 합은 k입니다.합이 k인 부분 수열이 여러 개인 경우 길이가 짧은 수열을 찾습니다.길이가 짧은 수열이 여러 개인 경우 앞쪽(시작 인덱스가 작은)에 나오는 수열을 찾습니다.
수열을 나타내는 정수 배열 sequence와 부분 수열의 합을 나타내는 정수 k가 매개변수로 주어질 때, 위 조건을 만족하는 부분 수열의 시작 인덱스와 마지막 인덱스를 배열에 담아 return 하는 solution 함수를 완성해주세요. 이때 수열의 인덱스는 0부터 시작합니다.
제한 사항:
5 ≤ sequence의 길이 ≤ 1,000,000
1 ≤ sequence의 원소 ≤ 1,000
sequence는 비내림차순으로 정렬되어 있습니다.
5 ≤ k ≤ 1,000,000,000k는 항상 sequence의 부분 수열로 만들 수 있는 값입니다.
생각해 볼 점
1. 비내림차순 = 그냥 올림차순인데 중복이 있는거..
2. 투포인터로 풀이를 하는데 이때 break point 깔끔하게 정하기!
3. 범위를 보면 절대 O(n²)를 허용하면 안 된다! for 문 안에 O(n) 걸리는 sum() 쓰면 안 됨.
내 풀이:
# 내꺼 참고하지 마셈. 아래 더 나은 코드 있음.
def solution(sequence, k):
# sequence.sort() #할 필요 없음...
length = len(sequence) #O(n)
r = 0
l = 0
current_sum = sequence[0]
width = 1000000000
ans_r = 0
ans_l = 0
while 1:
if current_sum < k:
r += 1
if r == length: break
current_sum += sequence[r]
elif current_sum > k:
current_sum -= sequence[l]
l += 1
# print(l,r)
elif current_sum == k:
s = r - l
if s < width:
width = s
ans_r = r
ans_l = l
if width == 0:
print(ans_l,ans_r)
return list([ans_l,ans_r])
r += 1
if r == length: break
current_sum += sequence[r]
return list([ans_l,ans_r])
고쳐야 할 점:
1. 구조가 복잡함
- 아니 break 왜 2개여야 하는데... 흑 근데 막상 합치려니 모르겠음.
- r += 1 이런 중복된 코드는 합쳐야 함.
=> 애초에 처음부터 구조를 깔끔하게 잡으려고 노력하고 가야 함.
"확장 조건은?" (보통 sum < target)
"축소 조건은?" (보통 sum >= target)
-> 이렇게 딱 깔끔하게 생각하고 하기
2. 변수 너무 남발함.
가독성 있게 하려고 변수 자꾸 만드는데 그게 오히려 더 가독성을 죽임.
훨씬 더 나은 다른 사람 풀이:
(누르면 이동 가능)
def solution(sequence, k):
l = r = 0
answer = [0, len(sequence)]
sum = sequence[0]
while True:
if sum < k:
r += 1
if r == len(sequence): break
sum += sequence[r]
else:
if sum == k:
if r-l < answer[1]-answer[0]:
answer = [l, r]
sum -= sequence[l]
l += 1
return answer
코테 깔끔하게 쓰는 마스터 되는 그날까지..! 🥹화이팅이다!

'알고리즘' 카테고리의 다른 글
| 게임 맵 최단거리 - 프로그래머스 Python (0) | 2026.02.18 |
|---|---|
| 입국심사 - 프로그래머스 Python (0) | 2026.02.15 |
| 달리기 경주 - 프로그래머스 python (0) | 2026.02.05 |
| 프로그래머스 - 체육복 with Python (0) | 2025.07.08 |
| 파이썬 자료형 - 부제: 파이썬 코테의 장점 (0) | 2025.07.07 |