[파이썬 알고리즘 문제풀이] - Section3 / 탐색 & 시뮬레이션 -5

Chooooo·2023년 1월 25일
0

🎈 수들의 합

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을 넘지 않는 자연수이다.

▣ 출력설명
첫째 줄에 경우의 수를 출력한다.

import sys
sys.stdin = open("input.text", "rt")

N, M = map(int, input().split())
data = list(map(int, input().split()))

cnt = 0
s = 0
e = 1
res = data[0]  #시작 값

while True:
    if res < M:
        if e < N:  #이 경우에만 더해줘야지
            res += data[e]
            e += 1
        else:  #end 부분이 N이 된 경우
            break
    elif res == M:
        cnt += 1
        res -= data[s]
        s += 1
    else:
        res -= data[s]
        s += 1

print(cnt)

🎃 코멘트
전체 과정을 생각할 수 있었어야 한다.
s~e인덱스까지의 더하고 e는 넘어갔음. 그렇기에 반복문을 e로 설정하면 된다는거 이해하기.
시작 총합 값을 0번 인덱스로 세팅해주고 시작했음. 그리고 end 인덱스를 움직이면서 파악. 반복문이 움직이면서 어떻게 구동되는지 알았어야 함. 바로 못풀었는데 한번 작은 경우로 돌려보면서 어떻게 구동될지 생각해보는 연습하자.

profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글