Algorithm/Baekjoon

[Python] 1806. 부분 합

느낌표 공장장 2021. 12. 16. 22:50

for문 풀이 

n, s = map(int, input().split())    # 숫자 개수 n, 목표 합 s
numbers = list(map(int, input().split()))   # 숫자들

tmp_sum = 0     # 임시 숫자들의 합을 저장할 변수
answer = 128349127598217598718296792   # 길이 크게크게 설정 (가장 짧은 것을 구하는 것이므로)
p = 0   # 움직일 포인터 (왼쪽)
for i in range(n):    # i == 오른쪽 포인터
    tmp_sum += numbers[i]   # i번째 숫자 더하기

    if s <= tmp_sum:    # 숫자들의 합이 목표 합보다 크거나 같다면
        for j in range(p, i+1):     # 합한 숫자들에서 맨 왼쪽 숫자 빼보면서 길이 줄이기
            tmp_sum -= numbers[j]   # 가장 왼쪽 숫자 (가장 먼저 더한 숫자 빼기)
            if tmp_sum < s:         # 목표 합(s)보다 작아졌다면 (목표 합보다 작아질 때까지 빼는거임)
                # tmp_l = i - j + 1
                # answer = tmp_l if tmp_l < answer else answer
                answer = min(i - j + 1, answer) # 길이 짧은걸로 갱신
                p = j + 1   # (왼쪽) 포인터는 방금 뺀 숫자의 다음부터 시작
                # (방금 뺀 숫자를 포함하면 목표 합이 된다. 방금 뺀 숫자를 포함하지 않으면 목표 합보다 작아지므로 거기서부터 다시 오른쪽 포인터 옮기면서 더해간다)
                break   # 이미 목표 합보다 숫자가 작아졌으므로 중단

if answer == 128349127598217598718296792:   # 목표 합을 구할 수 없는 경우
    answer = 0

print(answer)

 

while문 풀이 

n, s = map(int, input().split())    # 숫자 개수 n, 목표 합 s
numbers = list(map(int, input().split()))   # 숫자들

inf = float('inf')
answer = inf   # 길이 무한대로 설정 (가장 짧은 것을 구하는 것이므로)

tmp_sum = numbers[0]     # 임시 숫자들의 합을 저장할 변수
l = r = 0  # 움직일 포인터
while l <= r and r < n:  # l이 r 포인터보다 넘어서거나, r포인터가 n을 넘어설때까지 반복
    if s <= tmp_sum:    # 숫자들의 합이 목표 합보다 크거나 같은 경우
        # 길이 갱신
        tmp_l = r - l + 1
        answer = tmp_l if tmp_l < answer else answer

        # 길이 줄이기 (제일 왼쪽 숫자 (가장 처음에 더한 숫자) 빼주기)
        tmp_sum -= numbers[l]
        l += 1  # 빼줬으니 l포인터 한칸 옮기기
        continue
    else:
        r += 1  # 목표 합에 도달하지 못했을 경우 r포인터 한칸 옮기기

    if r == n: break    # r포인터가 n이랑 같아졌다면 더이상 더할 숫자 없음! 중단. (인덱스 에러 방지)
    tmp_sum += numbers[r]   # r포인터가 가르키는 숫자 더해주기

print(answer if answer != inf else 0)   # 초기 설정한 숫자(무한대)와 같다면 0 출력 (목표 합 만들지 못한경우) 아니면 구한 길이 출력 !

'Algorithm > Baekjoon' 카테고리의 다른 글

[Python] 9251. LCS  (0) 2021.12.16
[Python] 12865. 평범한 배낭  (0) 2021.12.16
[Python] 12015. 가장 긴 증가하는 부분 수열2  (0) 2021.10.21
[Python] 2776. 암기왕  (0) 2021.10.20
[Python] 2589. 보물섬  (0) 2021.10.19