๊ด€๋ฆฌ ๋ฉ”๋‰ด

C-log

๐Ÿฆ โœจCell Algorithm : ๊ตฌ๊ฐ„์˜ ํ•ฉ ๋ณธ๋ฌธ

๐Ÿง Algorithm/โšกver.0

๐Ÿฆ โœจCell Algorithm : ๊ตฌ๊ฐ„์˜ ํ•ฉ

4:Bee 2024. 2. 11. 00:28
728x90

๊ตฌ๊ฐ„ ํ•ฉ์€ ํ•ฉ ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋” ์ค„์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํŠน์ˆ˜ํ•œ ๋ชฉ์ ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

  • ๊ตฌ๊ฐ„ ํ•ฉ์˜ ํ•ต์‹ฌ
    1. ํ•ฉ ๋ฐฐ์—ด์€ ๊ธฐ์กด์˜ ๋ฐฐ์—ด์„ ์ „์ฒ˜๋ฆฌ(๊ฐ€๊ณต)ํ•œ ๋ฐฐ์—ด์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
      • ex) [1, 2, 3, 4, 5] - (ํ•ฉ ๋ฐฐ์—ด) -> [1, 3, 6, 10, 15]
      • ex) [1, 2, 3, 4, 5] - (๊ตฌ๊ฐ„์˜ ํ•ฉ/2~4๊นŒ์ง€) -> 3+4+5 = 12
    2. ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์ด๋‹ค.
    3. ํ•ฉ ๋ฐฐ์—ด๊ณผ ๊ตฌ๊ฐ„ ํ•ฉ ๊ณต์‹์„ ์ „์žฌ์ ์†Œ์— ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์—์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ค„์ด๋Š” ๋ฐ ๋งŽ์€ ๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค.
    4. ๊ผญ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•ด์•ผํ•œ๋‹ค.

* ๋ˆ„์ ์˜ ํ•ฉ

๊ตฌ๊ฐ„์˜ ํ•ฉ๊ด€๋ จ ๋ฌธ์ œ๋“ค์„ ์‹ค๋ฒ„ 3~1์ •๋„์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ˆ„์ ์˜ ํ•ฉ ์˜ˆ์‹œ๋ฅผ ๋ด์•ผ ์กฐ๊ธˆ ๋” ์ดํ•ด๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. O(N)์ธ ๋ˆ„์ ์˜ ํ•ฉ์„ ํ•˜๊ธฐ ์ด์ „์— ์•„๋ž˜๋Š” O(N^2)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„์ธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์‚ดํŽด ๋ณด๊ฒ ๋‹ค.

 
array = [1, 8, 7, 4, 3, 5, 6]
# n = len(array)
prefix_sum = [0] * len(array)

for i in range(len(array)):
  print()
  for j in range(i+1):
    print(f'{j}',end=' ')
    prefix_sum[i] += array[j]
print()
print(prefix_sum)


0 1 
0 1 2 
0 1 2 3 
0 1 2 3 4 
0 1 2 3 4 5 
0 1 2 3 4 5 6 
[1, 9, 16, 20, 23, 28, 34]
 

์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด  ์ด์ค‘ for๋ฌธ์œผ๋กœ ๋˜์–ด ์žˆ๊ณ  prefix_sum๋ฐฐ์—ด ๋ณ€์ˆ˜๋Š” ๋ˆ„์ ๋˜๋Š” ๋ฐฐ์—ด์„ ๋‹ด์•„๋‚ด๋Š” ๋ณ€์ˆ˜์ด๋‹ค. ์ด์ œ O(N)์œผ๋กœ ๋˜์–ด ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 
array = [1, 8, 7, 4, 3, 5, 6]
# n = len(array)
prefix_sum = [0] * (len(array) + 1)
print(f'{prefix_sum}')
 
for i in range(len(array)):
  print(f'{i}',end=' ')
  prefix_sum[i + 1] = prefix_sum[i] + array[i]
  print(prefix_sum)
print()
print(prefix_sum)
 
[0, 0, 0, 0, 0, 0, 0, 0]
0 [0, 1, 0, 0, 0, 0, 0, 0]
1 [0, 1, 9, 0, 0, 0, 0, 0]
2 [0, 1, 9, 16, 0, 0, 0, 0]
3 [0, 1, 9, 16, 20, 0, 0, 0]
4 [0, 1, 9, 16, 20, 23, 0, 0]
5 [0, 1, 9, 16, 20, 23, 28, 0]
6 [0, 1, 9, 16, 20, 23, 28, 34]

[0, 1, 9, 16, 20, 23, 28, 34]
 

preifx_sum ๋ฐฐ์—ด ๋ณ€์ˆ˜์˜ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ +1์„ ํ•ด๋†“์€ ์ƒํƒœ์—์„œ index 0์ž๋ฆฌ ๋’ค์—์„œ ๋ถ€ํ„ฐ ๋ˆ„์ ์˜ ๋ฐฐ์—ด์„ ์‹คํ–‰ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐœ๋…์„ ์ž˜ ์ƒ๊ฐํ•˜๋ฉด์„œ ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ๋ณด๋ฉด ์ˆ˜์›”ํ•  ๊ฒƒ์ด๋‹ค.


* ๊ตฌ๊ฐ„์˜ ํ•ฉ

๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋กœ ์„ค๋ช…์„ ํ•ด๋ณด๊ฒ ๋‹ค. ๋ฐฐ์—ด์ด [1,2,3,4,5]๊ฐ€ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ตฌ๊ฐ„์ด 3์ด๋ผ๋ฉด 3๊ตฌ๊ฐ„ ๋งŒํผ์˜ ๊ฐ’์„ ํ™œ์šฉํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๊ตฌ๊ฐ„์ด 3์ด๋ฉด ๋จผ์ € 1,2,3๊นŒ์ง€์˜ 3๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ 1+2+3์ธ 6์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋‹ค. ์ดํ›„์— 2,3,4์˜ ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค๋ฉด ๋‹จ์ˆœํžˆ ์šฐ๋ฆฌ ์‚ฌ๋žŒ์˜ ๋จธ๋ฆฌ๋กœ๋Š” 2,3,4๋ฅผ ๋”ํ•˜๋ฉด ๋˜๊ฒ ์ง€๋งŒ ์ปดํ“จํ„ฐ ๊ธฐ์ค€์œผ๋ก  ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ ์œผ๋กœ 2,3,4๋ผ๋Š” ๊ณต๊ฐ„์„ ๋˜ ๋‹ค์‹œ ๋งŒ๋“ค๊ธฐ ๋ณด๋‹ค 1+2+3์—์„œ 4๋ฅผ ๋”ํ•˜๊ณ  ๊ธฐ์กด์— ์žˆ๋Š” 1์„ ๋นผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ 1+2+3+4-1์˜ ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

index 1์—์„œ๋ถ€ํ„ฐ 5๊นŒ์ง€์˜ ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

 
array = [1, 8, 7, 4, 3, 5, 6]
n = len(array)
prefix_sum = [0] * (n + 1)
x, y = 1, 5

for i in range(n):
print(f'{prefix_sum[i]} + {array[i]}')
prefix_sum[i + 1] = prefix_sum[i] + array[i]
print(prefix_sum)
 
part_sum = prefix_sum[y] - prefix_sum[x - 1]
print(part_sum)
 
0 + 1
[0, 1, 0, 0, 0, 0, 0, 0]
1 + 8
[0, 1, 9, 0, 0, 0, 0, 0]
9 + 7
[0, 1, 9, 16, 0, 0, 0, 0]
16 + 4
[0, 1, 9, 16, 20, 0, 0, 0]
20 + 3
[0, 1, 9, 16, 20, 23, 0, 0]
23 + 5
[0, 1, 9, 16, 20, 23, 28, 0]
28 + 6
[0, 1, 9, 16, 20, 23, 28, 34]
23
 

์™œ ๋นผ๊ธฐ๋ฅผ ํ•ด์•ผํ•˜๋Š” ์ง€ ๋” ๋ช…ํ™•ํ•œ ์ฆ๋ช…์ด ํ•„์š”ํ•˜๋‹ค.

๊ฐ•์˜ ์ด๋ฏธ์ง€ ์ฒจ๋ถ€

 

[์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ก ] ๊ตฌ๊ฐ„ํ•ฉ, ๋ˆ„์ ํ•ฉ(prefix sum)

์ด๋ก  1์ฐจ์› ๋ฐฐ์—ด ๋ˆ„์ ํ•ฉ ๋ˆ„์ ํ•ฉ๋ถ€ํ„ฐ ๋จผ์ € ์„ค๋ช…ํ•˜๋ฉด 0๋ฒˆ์งธ ์ธ๋ฑ์Šค ๋ถ€ํ„ฐ N ๋ฒˆ์งธ ์ธ๋ฑ์Šค๊นŒ์ง€ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์ธ๋ฑ์Šค i์ผ๋•Œ 0๋ฒˆ์งธ ์ธ๋ฑ์Šค ๋ถ€ํ„ฐ 0๋ฒˆ์งธ ์ธ๋ฑ์Šคํ•ฉ์„ ๋งํ•œ๋‹ค. Python array = [1, 8, 7, 4, 3, 5, 6] n = len

jih3508.tistory.com


 

๋ˆ„์ ์˜ ํ•ฉ๊ณผ ๊ตฌ๊ฐ„์˜ ํ•ฉ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€.

๊ฒฐ๊ณผ์ ์œผ๋ก  ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋‘˜์˜ ๋ช…ํ™•ํ•œ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ?


๋งŒ์•ฝ ๊ณ„์†ํ•ด์„œ ๋ฐฐ์—ด์˜ ๊ฐ’์ด ๋ณ€ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

์ด๋Ÿด๋•Œ๋Š” ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ/์ธ๋ฑ์Šค ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.


์‹ค์ „ ๋ฌธ์ œ : [BOJ] 11660

* ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์–ด๋–ป๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณ ๋ฏผ ํ•  ๊ฒƒ.

๋‚˜๋จธ์ง„ ์—ฐ์‚ฐ์„ ํ•˜๊ณ  ๊ฐ’๋“ค์„ ๋”ํ•˜๊ณ  ๋‹ค์‹œ 3์„ ๋‚˜๋ˆ„๋Š” ๊ฒƒ๊ณผ ํ•ด๋‹น ๋ฒ”์œ„์˜ ๊ฐ’์„ ๋”ํ•˜๊ณ  3์„ ๋‚˜๋ˆ„๋Š” ๊ฒฐ๊ณผ๋Š” ๊ฐ™๋‹ค๋Š”  ๊ฒƒ์ด๋‹ค.

728x90
Comments