๋ฐฑ์ค€ 2003 ํŒŒ์ด์ฌ

2022. 1. 7. 00:23ใ†๐Ÿ”ฑ Algorithm/Else

https://www.acmicpc.net/problem/2003

 

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

 

์‚ฌ๊ณ  ๊ณผ์ •

1. M ์ด๋ž‘ ๋งค์นญ๋  ๋•Œ๊นŒ์ง€ ์ฐจ๋ก€๋กœ ๋”ํ•˜๊ฑฐ๋‚˜
2. M ๋ณด๋‹ค ์ปค์ง€๋ฉด break
3. ์–ด๋–ป๊ฒŒ M ์„ ๋งž์ถ”๋Š๋ƒ๋Š” ๊ด€์‹ฌ์—†๋‹ค.  ์—ฐ์†๋œ ์ˆซ์ž์˜ ๋ช‡๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ M ์„ ๋งž์ถ”๋Š”์ง€๊ฐ€ ์ค‘์š”.

 

์ •๋‹ต ์ฝ”๋“œ

from sys import stdin


N, M = map(int, stdin.readline().split())
arr = list(map(int, stdin.readline().split()))
count = 0
left, right = 0, 1

if arr[0] == M:
    count += 1
while right < len(arr):
    total = sum(arr[left: right + 1])
    if total < M:
        right += 1
    elif total > M:
        left += 1
    else:
        count += 1
        left += 1
        right += 1


print(count)

 

์ฒ˜์Œ ํ’€์ด (์˜ค๋‹ต)

์ด์ค‘ for ๋ฌธ์œผ๋กœ ์ ‘๊ทผํ–ˆ๋‹ค. ํ’€๋ฉด์„œ๋„ ๋‹น์—ฐํžˆ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚  ๊ฒƒ์ด๋ผ ์˜ˆ์ƒํ–ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ ์Šฌ๋ผ์ด์‹ฑ์œผ๋กœ ์ธํ•ด ์‚ฌ์‹ค์ƒ ์‹œ๊ฐ„๋ณต์žก๋„ O(N^3)... 

๋ฐ˜๋ณต๋ฌธ์„ ํ•œ๋ฒˆ๋งŒ ๋Œ๋ฆฌ๋˜ ๋‘๋ฒˆ ๋Œ๋ฆฐ ๊ฒƒ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋‚ด๋Š” ๊ฒƒ, ๊ทธ๊ฒƒ์ด ์ด๋ฒˆ ๋ฌธ์ œ(two pointer ๋ผ๊ณ  ํ•˜๋”๋ผ)๋ฅผ ํ‘ธ๋Š” ํ•ต์‹ฌ์ด๋‹ค.

๋‘๋ฒˆ ๋Œ๋ฆฐ ๊ฒƒ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋‚ด๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

๋‘๋ฒˆ์งธ for ๋ฌธ์„ ์‚ดํŽด๋ณด๋ฉด, j ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด์„œ ๋ฐ˜๋ณต๋ฌธ์„ ์ง„ํ–‰ํ•œ๋‹ค. j ์ธ๋ฑ์Šค๋Š” i ์ดํ›„์˜ ์ธ๋ฑ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๊ทธ๋Ÿผ j ์ธ๋ฑ์Šค๋ฅผ ์ž๋™์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚ฌ์ˆ˜๋งŒ ์žˆ๋‹ค๋ฉด, ๋‘๋ฒˆ์งธ for ๋ฌธ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ๋‹ค.

from sys import stdin


N, M = map(int, stdin.readline().split())
arr = list(map(int, stdin.readline().split()))
count = 0

for i in range(N):
    for j in range(i + 1, N + 1):
        temp = sum(arr[i:j])
        if temp == M:
            count += 1
            break

        elif temp > M:
            break
print(count)

 

 

๋” ๋น ๋ฅธ ํ’€์ด

๋‚ด๊ฐ€ ํ‘ผ ์ •๋‹ต์ฝ”๋“œ๋Š” ๋ฆฌ์ŠคํŠธ ์Šฌ๋ผ์ด์‹ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(N^2) ๊ฐ€ ๋˜์–ด ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค. 

์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋ฆฌ์ŠคํŠธ ์Šฌ๋ผ์ด์‹ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์—ฐ์†๋œ ์›์†Œ์˜ ํ•ฉ์„ ๊ตฌํ•˜์—ฌ, ํ’€์ด ์†๋„๋ฅผ ์ค„์ธ ์ผ€์ด์Šค๋‹ค.

 

while True ๋ฌธ์˜ ํƒˆ์ถœ ์กฐ๊ฑด์œผ๋กœ๋Š” right ๋ณ€์ˆ˜๊ฐ€ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ปค์ง€๋Š” ์ˆœ๊ฐ„์œผ๋กœ ์ •ํ–ˆ๋‹ค. ๊ทธ ์ „๊นŒ์ง€๋Š” ๊ณ„์† ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ ๋‘ ๋ณ€์ˆ˜(left, right)์™€ ํ•ฉ๊ณ„(total)์„ ์กฐ์ ˆํ•œ๋‹ค. ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•  ๋•Œ ์Šฌ๋ผ์ด์‹ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๊ณง๋ฐ”๋กœ ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„์—์„œ ์šฐ์œ„๋ฅผ ๊ฐ–๋Š”๋‹ค( = ๋”  ๋น ๋ฅด๋‹ค)

N, M = map(int, input().split())
A = [ int(x) for x in input().split() ]

left = 0
right = 0
total = 0
ans = 0

while True:
    if total >= M:
        total -= A[left]
        left += 1
    elif right == N:
        break
    else:
        total += A[right]
        right += 1
    if total == M:
        ans += 1

        
print(ans)

 

 

๋ฐฐ์šด ๊ฒƒ

- two pointer ๋ผ๋Š” ์ ‘๊ทผ๋ฒ•

- slicing์€ ์‹œ๊ฐ„๋ณต์žก๋„ O(N)