๐Ÿงฉ Problem Solving/[๋ฐฑ์ค€]

[๋ฐฑ์ค€] 1806 ๋ถ€๋ถ„ํ•ฉ (python ํŒŒ์ด์ฌ)

์ œ๋ด‰์•„ 2022. 7. 29. 04:03

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

 

1806๋ฒˆ: ๋ถ€๋ถ„ํ•ฉ

์ฒซ์งธ ์ค„์— N (10 ≤ N < 100,000)๊ณผ S (0 < S ≤ 100,000,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์ˆ˜์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ์ˆ˜์—ด์˜ ๊ฐ ์›์†Œ๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด์ ธ ์žˆ์œผ๋ฉฐ, 10,000์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค.

www.acmicpc.net


์•„์ด๋””์–ด

1. ๋ถ€๋ถ„ํ•ฉ ์‚ฌ์šฉ

  • ๋ถ€๋ถ„ํ•ฉ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์–˜๊ธฐํ•ด๋ณด๋ฉด 0 ~ N๊นŒ์ง€์˜ ํ•ฉ์„ ๋ฏธ๋ฆฌ ๊ตฌํ•ด๋‘๊ณ  ํ•ฉ์˜ ์ฐจ((0 ~ b๊นŒ์ง€ ํ•ฉ) - (0 ~ a๊นŒ์ง€ ํ•ฉ))๋ฅผ ํ†ตํ•ด a๋ถ€ํ„ฐ b๊นŒ์ง€ ์ˆ˜์˜ ํ•ฉ์„ ๋น ๋ฅด๊ฒŒ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ๊ทธ๋ž˜์„œ for๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ๊ธธ์ด๊ฐ€ 1์ผ ๋•Œ, 2์ผ ๋•Œ... N์ผ ๋•Œ ๋ถ€๋ถ„ํ•ฉ์˜ ๊ฐ’์„ ๊ตฌํ•ด๋ณด๋ฉฐ S๊ฐ’์ด ๋„˜๋Š” ์ˆœ๊ฐ„ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์งฐ๋‹ค. ๋‹น์—ฐํ•˜๊ฒŒ๋„ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋–ด๋‹ค. ์•„๋งˆ ๊ธธ์ด๊ฐ€ ๊ธด ๊ฒฝ์šฐ ๋•Œ๋ฌธ์ธ ๊ฑฐ ๊ฐ™๋‹ค.
  • ๊ณ ๋ฏผ ๊ณ ๋ฏผํ•˜๋‹ค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜๋ฅผ ๋ณด๊ณ  ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค. 

2. ํˆฌ ํฌ์ธํ„ฐ

  • ๋‹ค์‹œ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๊ฐ€์ง€๋งŒ ์ฒ˜์Œ ๋ดค์„ ๋•Œ๋Š” ํˆฌ ํฌ์ธํ„ฐ๋Š” ์ƒ๊ฐ์„ ๋ชปํ–ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํˆฌ ํฌ์ธํ„ฐ๋ฅผ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์งง์€ ์‹œ๊ฐ„์ œํ•œ์ด ํžŒํŠธ์ธ ๊ฑฐ ๊ฐ™๊ธด ํ•˜๋‹ค.
  • ํˆฌ ํฌ์ธํ„ฐ ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ฉด ์ดํ›„ ํ’€์ด ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ถ€๋ถ„ํ•ฉ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํˆฌ ํฌ์ธํ„ฐ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

์ „์ฒด ์ฝ”๋“œ

import sys
N, S = map(int, input().split())
array = [int(x) for x in sys.stdin.readline().rstrip().split()]

left = 0
right = 0
length = 100000
temp_sum = array[0]

while left <= right:
    if temp_sum >= S:
        length = min(length, right - left + 1)
        temp_sum -= array[left]
        left += 1
    else:
        right += 1
        if right < N:
            temp_sum += array[right]
        else:
            break

if length == 100000:
    print(0)
else:
    print(length)

์ฝ”๋“œ ์„ค๋ช…

left = 0
right = 0
length = 100000
temp_sum = array[0]

while left <= right:
    if temp_sum >= S:
        length = min(length, right - left + 1)
        temp_sum -= array[left]
        left += 1
    else:
        right += 1
        if right < N:
            temp_sum += array[right]
        else:
            break

๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด ๋ถ€๋ถ„ํ•ฉ์ด S๋ฅผ ๋„˜์œผ๋ฉด left๋ฅผ ํ•œ ์นธ ์˜ฎ๊ฒจ์„œ ํ•ฉ์„ ์ค„์—ฌ๋ณด๊ณ 

์•„๋‹ˆ๋ผ๋ฉด right๋ฅผ ํ•œ ์นธ ์˜ฎ๊ฒจ์„œ S๋ฅผ ๋„˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด๋ฉด ๋œ๋‹ค.

right๊ฐ€ N๊นŒ์ง€ ๊ฐ€๊ฑฐ๋‚˜ left๊ฐ€ right๋ฅผ ๋„˜๊ธฐ๋ฉด ์ข…๋ฃŒ ํ•ด์ค€๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋ถ€๋ถ„ํ•ฉ์ด S๋ฅผ ๋„˜๊ธธ ๋•Œ ๊ธฐ์กด์˜ ์ €์žฅ๋œ ๊ธธ์ด(length)์™€ ํ˜„์žฌ ๊ธธ์ด(right - left + 1)๋ฅผ ๋น„๊ตํ•ด์„œ ์ž‘์€ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

 

์ถœ๋ ฅ์—์„œ ํ•ฉ์„ ๋งŒ๋“œ๋Š” ๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด 0์„ ์ถœ๋ ฅํ•˜๋ผ ํ•˜์˜€์œผ๋ฏ€๋กœ

length๊ฐ€ 100000์ด๋ฉด(if temp_sum >= S ๊ตฌ๋ฌธ์ด ์‹คํ–‰ ์•ˆ๋œ ๊ฒฝ์šฐ) 0์„ ์ถœ๋ ฅํ•˜๊ณ 

์•„๋‹ˆ๋ผ๋ฉด length๊ฐ’์„ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.