문제설명
아이디어가 중요한 문제
*본 문제는 인프런 김태원 강사님의 파이썬 알고리즘 문제풀이 강의에 기반합니다.
[문제 수들의 합]
N개의 수로 된 수열 A[1], A[2],...,A[N]이 있다. 이 수열의 i번째 수부터 j번째 수까지의 합 A[i]+A[i+1]+...+A[j-1]+A[j]가 되는 M이 되는 경우의 수를 구하는 프로그램을 작성하시오
-입력설명
첫째 줄에 N (1<=N<=10,000), M(1<=M<=300,000,000)이 주어진다. 다음 줄에는 A[1], A[2],...,A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.
-출력설명
첫째 줄에 경우의 수를 출력한다.
-입력예제1
8 3
1 2 1 3 1 1 1 2
-출력예제1
5
풀이
(1 2) , (2 1) ,(3) , (1 1 1), (1 2) -> print(cnt) #5
import sys
sys.stdin=open("input.txt", "r")
n, m=map(int, input().split())
a=list(map(int, input().split()))
lt=0
rt=1
tot=a[0]
cnt=0
while lt<n:
if tot<m:
tot+=a[rt]
rt+=1
elif tot==m:
cnt+=1
tot-=a[lt]
lt+=1
else:
tot-=a[lt]
lt+=1
print(cnt)
--> while문의 if 문을
이렇게 하면 'rt' 포인터가 넘어가게 돼서 (ERROR : list index out of range)
if rt<n 이렇게 범위를 지정해줘야하는구나!!!
import sys
sys.stdin=open("input.txt", "r")
n, m=map(int, input().split())
a=list(map(int, input().split()))
lt=0
rt=1
tot=a[0]
cnt=0
while True:
if tot<m:
if rt<n:
tot+=a[rt]
rt+=1
else:
break
elif tot==m:
cnt+=1
tot-=a[lt]
lt+=1
else:
tot-=a[lt]
lt+=1
print(cnt)
'알고리즘? > 기본3 탐색&시뮬레이션(string, 1차원 2차원 리스트 탐색)' 카테고리의 다른 글
7. 사과나무 (다이아몬드 ) (0) | 2023.05.10 |
---|---|
6. 격자판 최대합 (1) | 2023.05.10 |
4. 두 리스트 합치기 (0) | 2023.05.09 |
3. 카드 역배치(정올 기출) (pop) (0) | 2023.05.08 |
2. 숫자만 추출 (isdecimal, isdigit) , 숫자화 시키는 방법 (0) | 2023.05.08 |