๐Ÿค–/์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ฆฌ

ํˆฌ ํฌ์ธํ„ฐ (Two Pointers)

sssbin 2023. 6. 13. 15:12

 

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

๋ฆฌ์ŠคํŠธ์— ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•  ๋•Œ 2๊ฐœ์˜ ์  ์œ„์น˜๋ฅผ ๊ธฐ๋กํ•˜๋ฉด์„œ ์ฒ˜๋ฆฌ

 

 

ํŠน์ •ํ•œ ํ•ฉ์„ ๊ฐ€์ง€๋Š” ๋ถ€๋ถ„ ์—ฐ์† ์ˆ˜์—ด ์ฐพ๊ธฐ

* ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹œ์ž‘์ ์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™์‹œํ‚ค๋ฉด ํ•ญ์ƒ ํ•ฉ์ด ๊ฐ์†Œํ•˜๊ณ ,

   ๋์ ์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™์‹œํ‚ค๋ฉด ํ•ญ์ƒ ํ•ฉ์ด ์ฆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์—

   ํˆฌ ํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

* ๋ฆฌ์ŠคํŠธ ๋‚ด ์›์†Œ์— ์Œ์ˆ˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, ํˆฌ ํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค.

 

n = 5 # ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜
m = 5 # ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ถ€๋ถ„ํ•ฉ
data = [1, 2, 3, 2, 5] # ์ „์ฒด ์ˆ˜์—ด

count = 0
interval_sum = 0
end = 0

# start๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ ๋ฐ˜๋ณต
for start in range(n):
    # end๋ฅผ ๊ฐ€๋Šฅํ•œ ๋งŒํผ ์ด๋™์‹œํ‚ค๊ธฐ
    while interval_sum < m and end < n:
        interval_sum += data[end]
        end += 1
    # ๋ถ€๋ถ„ํ•ฉ์ด m์ผ ๋•Œ ๋ฐ์ดํ„ฐ ์ฆ๊ฐ€
    if interval_sum == m:
        count += 1
    interval_sum -= data[start]

print(count)

 

 

์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ํ•ฉ์ง‘ํ•ฉ

* ์‹œ๊ฐ„๋ณต์žก๋„ O(N+M) -> ๊ฐ ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ ์ˆœํšŒ

* ๋ณ‘ํ•ฉ์ •๋ ฌ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

# ์‚ฌ์ „์— ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ A์™€ B ์„ ์–ธ
n, m = 3, 4
a = [1, 3, 5]
b = [2, 4, 6, 8]

# ๋ฆฌ์ŠคํŠธ A์™€ B์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ํฌ๊ธฐ์˜ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
result = [0] * (n+m)
i, j, k = 0, 0, 0

# ๋ชจ๋“  ์›์†Œ๊ฐ€ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์— ๋‹ด๊ธธ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
while i < n or j < m:
    # ๋ฆฌ์ŠคํŠธ B์˜ ๋ชจ๋“  ์›์†Œ๊ฐ€ ์ฒ˜๋ฆฌ๋˜์—ˆ๊ฑฐ๋‚˜, ๋ฆฌ์ŠคํŠธ A์˜ ์›์†Œ๊ฐ€ ๋” ์ž‘์„ ๋•Œ
    if j >= m or (i < n and a[i] <= b[j]):
        # ๋ฆฌ์ŠคํŠธ A์˜ ์›์†Œ๋ฅผ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ๋กœ ์˜ฎ๊ธฐ๊ธฐ
        result[k] = a[i]
        i += 1
    # ๋ฆฌ์ŠคํŠธ A์˜ ๋ชจ๋“  ์›์†Œ๊ฐ€ ์ฒ˜๋ฆฌ๋˜์—ˆ๊ฑฐ๋‚˜, ๋ฆฌ์ŠคํŠธ B์˜ ์›์†Œ๊ฐ€ ๋” ์ž‘์„ ๋•Œ
    else:
        # ๋ฆฌ์ŠคํŠธ B์˜ ์›์†Œ๋ฅผ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ๋กœ ์˜ฎ๊ธฐ๊ธฐ
        result[k] = b[j]
        j += 1
    k += 1

# ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ
for i in result:
    print(i, end=' ')