์•Œ๊ณ ๋ฆฌ์ฆ˜/์„ ํ˜•๊ตฌ์กฐ

[๋ฐฑ์ค€ 2003 ๐Ÿฅˆ] ์ˆ˜๋“ค์˜ ํ•ฉ2

1eehyunji 2023. 7. 31. 22:57

๋ฌธ์ œ

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

4 2
1 1 1 1

์˜ˆ์ œ ์ถœ๋ ฅ 1

3

์˜ˆ์ œ ์ž…๋ ฅ 2

10 5
1 2 3 4 2 5 3 1 1 2

์˜ˆ์ œ ์ถœ๋ ฅ 2

3

 

๋ฌธ์ œํ’€์ด

import sys

n,m=map(int, sys.stdin.readline().split(' '))
numbers=list(map(int, sys.stdin.readline().split(' ')))
ans=0
end=0
cur=0
# ํˆฌ ํฌ์ธํ„ฐ
for start in range(n):
    # ์ผ์ข…์˜ ์™„์ „ ํƒ์ƒ‰ ๋ฐฉ์‹ -> pypy์—์„œ๋งŒ ํŒจ์Šค
    # cur_sum = numbers[start]
    # if cur_sum == m:
    #     ans += 1
    # for end in range(start + 1, n):
    #     if cur_sum >= m:
    #         break
    #     cur_sum = cur_sum + numbers[end]
    #     if cur_sum == m:
    #         ans += 1
    while cur<m and end<n:
        cur+=numbers[end]
        end+=1
    if cur==m:
        ans+=1
    cur-=numbers[start]

print(ans)

์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ๋Š” pypy์—์„  ํ†ต๊ณผํ•˜์ง€๋งŒ python์—์„  ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ๋Š” ์‚ฌ์‹ค์ƒ ๊ฑฐ์˜ ์™„์ „ ํƒ์ƒ‰์ด๋‚˜ ๋‹ค๋ฆ„์—†์—ˆ๋‹ค.

๋ณผํŽœ์œผ๋กœ ๋„์ ์—ฌ ๋ณธ๊ฑฐ๋ผ ์ž˜ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์œผ์‹ค์ง„ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒใ… ใ… .. start๋ฅผ 0์—์„œ n-1๊นŒ์ง€ ๋ถ€์—ฌํ•˜๊ณ , end=start+1๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€ ํ›„์—

for๋ฌธ์„ ๋Œ๋ฉด์„œ ์ง€๊ธˆ๊นŒ์ง€ ์ง€๋‚˜์˜จ ๊ฐ’์„ ๋ชจ๋‘ ํ•ฉํ•œ cur_sum๊ฐ’์ด m๋ณด๋‹ค ์ปค์งˆ ๊ฒฝ์šฐ breakํ•˜๊ณ , m๊ณผ ๊ฐ™์„ ๊ฒฝ์šฐ ans+=1ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค.

start๊ฐ€ 0์ผ ๋•Œ cur_sum=numbers[0]์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜๊ณ , end=1๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  end๊ฐ€ n๋ณด๋‹ค ์ž‘์„ ๋•Œ๊นŒ์ง€ numbers[end]๋ฅผ cur_sum์— ๋”ํ•ด์ฃผ๋ฉด์„œ for๋ฌธ์„ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋˜๋Š”๋ฐ(1+2+3+...) ๋ฐ˜๋ณต ๋„์ค‘์— m๊ฐ’์ธ 5๋ณด๋‹ค ์ปค์ง€๋ฉด break๋œ๋‹ค. 

๊ฒฐ๊ตญ ๋ชจ๋“  start ์ง€์ ์—์„œ๋ถ€ํ„ฐ ๋‹ค์Œ ์š”์†Œ๋“ค์„ m๋ณด๋‹ค ์ปค์ง€๊ฑฐ๋‚˜ ๊ฐ™์•„์งˆ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ด์„œ ๋”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

๊ทธ๋ž˜์„œ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด start๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ๋งˆ๋‹ค cur_sum๊ณผ end๊ฐ’์„ ์ƒˆ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ธฐ์กด์˜ cur_sum ๊ฐ’์—์„œ numbers[start]์„ ๋นผ์ฃผ๊ณ , ๋‹ค์‹œ cur_sum ๊ฐ’์ด m๋ณด๋‹ค ์ž‘๊ณ , end ๊ฐ’์ด n๋ณด๋‹ค ์ž‘์„ ๋•Œ๊นŒ์ง€ cur_sum+=numbers[end]๋ฅผ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค. 

cur_sum์ด m๊ณผ ๋™์ผํ•œ ๊ฒฝ์šฐ์—” ans+=1์„ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.