현제의 현재이야기

[백준/파이썬] 2003 - 수들의 합2 본문

algorithm

[백준/파이썬] 2003 - 수들의 합2

현재의 현제 2023. 5. 22. 10:37
 

2003번: 수들의 합 2

첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.

www.acmicpc.net

n, m = map(int,input().split())
arr = list(map(int, input().split()))

left, right = 0, 1
answer = 0
while right <= n and left <= right:
    total = sum(arr[left:right])

    if total == m:
        answer += 1
        
        right += 1

    elif total > m:
        left += 1

    else:
        right += 1
    
print(answer)

나만 몰랐던 슬라이싱에 대한 것들

1. 슬라이싱은 인덱스 에러가 나지 않는다

a = [1, 2, 3]
print(a[0:0])
>> []

a = [1, 2, 3]
print(a[2:4])
>> [3]

a = [1, 2, 3]
print(a[3:10000])
>> []

2.  left와 right가 같을 때, left부터 left - 1 까지 탐색이 되기 때문에 빈 리스트가 나온다.

a = [1, 2, 3]
print(a[3:3])
>> []

따라서 문제에서 얘시를 들자면

3 1
1 3 1 >> 입력
------
0 1 -> answer = 1
0 2
1 2
2 2 -> 빈 리스트, not [1]
2 3 -> answer = 2
2 4 -> right > n, while 탈출
------
2 >> 출력

3.  리스트 슬라이싱의 시간 복잡도는 O(k)로 상대적으로 효율적이다. 자주 사용하자

Comments