post-custom-banner

๐Ÿ“š ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

๐Ÿ’ก์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ž€?

์›์†Œ ๋ฐ ๋‹ค์Œ ๋…ธ๋“œ๋กœ์˜ ๋งํฌ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๋…ธ๋“œ๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ.

  • ๋งํฌ?
    ๋…ธ๋“œ๊ฐ€ ์ปดํ“จํ„ฐ ๋ฉ”๋ชจ๋ฆฌ์ƒ์—์„œ ์–ด๋–ค ์ฃผ์†Œ๋กœ ์ €์žฅ๋˜์–ด์žˆ๋Š”๊ฐ€๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” ์ •๋ณด.(ํฌ์ธํ„ฐ = ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ์ฃผ์†Œ)
  • ํŠน์ง•
    1. get(i), set(i,x)๋ฅผ ์ƒ์ˆ˜ ์‹œ๊ฐ„์— ํ•  ์ˆ˜ ์—†์Œ.
    1. ๋ฐฐ์—ด๋ณด๋‹ค ๋™์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋…ธ๋“œ์˜ ๋ ˆํผ๋Ÿฐ์Šค๋งŒ ์ฃผ์–ด์ง„๋‹ค๋ฉด, ๋…ธ๋“œ์˜ ์ถ”๊ฐ€์™€ ์‚ญ์ œ๋ฅผ ์ƒ์ˆ˜ ์‹œ๊ฐ„์— ํ•  ์ˆ˜ ์žˆ์Œ.

๐Ÿ’ก๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ž€?

๋…ธ๋“œ๋“ค์˜ ์—ฐ์†์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ๊ฐ ๋…ธ๋“œ u๋Š” ๋ฐ์ดํ„ฐ u.x์™€ ๋‹ค์Œ ๋…ธ๋“œ๋กœ์˜ ๋งํฌ์ธ u.next ๊ฐ’์„ ๊ฐ€์ง. (๋งˆ์ง€๋ง‰ ๋…ธ๋“œ w์˜ w.next = nil)

  • queue์—ฐ์‚ฐ (add, remove) ๊ณผ stack์—ฐ์‚ฐ (push, pop) ์„ ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•œ ์˜ˆ.

  • queue์—์„œ๋Š” tail์—์„œ add๊ฐ€ ์ผ์–ด๋‚˜๊ณ  head์—์„œ remove๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๋ฐ˜๋ฉด, stack์€ pop, push๋ชจ๋‘ head ์—์„œ ์ผ์–ด๋‚จ.
initialize()
n <- 0 # node ์ˆ˜
head <- nil # head ์—†์Œ
tail <- nil # tail ์—†์Œ
push(x)
# head์ชฝ์— x์ถ”๊ฐ€
	u <- new_node(x) # x๋ฅผ ๋‹ด๋Š” ์ƒˆ node ์ƒ์„ฑ
	u.next <- head # ์ƒˆ node์˜ ๋งํฌ๊ฐ€ ๊ธฐ์กด head๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•จ
	head <- u # ์ƒˆ node๊ฐ€ ์ƒˆ๋กœ์šด head๊ฐ€ ๋จ
# ๊ธฐ์กด์— ๋นˆ ๋ฆฌ์ŠคํŠธ์˜€๋‹ค๋ฉด node๊ฐ€ ํ•˜๋‚˜๋ฐ–์— ์—†์œผ๋ฏ€๋กœ tail ์—ญ์‹œ ์ƒˆ๋กœ์šด node๋กœ ์ง€์ •
	if n = 0 then
    	tail <- u
    n <- n + 1 # node ์ˆ˜ ์ฆ๊ฐ€
    return x
pop()
# head๋ฅผ ๋ฆฌํ„ด ํ›„ ์ œ๊ฑฐ
# ๋น„์–ด์žˆ๋Š” ๋ฆฌ์ŠคํŠธ ์ด๋ฉด nil return
	if n = 0 then return nil
# ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด head์˜ ์›์†Œ ์ถ”์ถœ
	x <- head.x
# ๊ธฐ์กด head์˜ ๋‹ค์Œ node๋ฅผ head๋กœ ์ €์žฅ
	head <- head.next
    n <- n - 1
# node ์ˆ˜ ๊ฐ์†Œ ํ›„ ๋นˆ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋œ ๊ฒฝ์šฐ tail์— Nil์ €์žฅ
	if n = 0 then
    	tail <- nil
	return x
remove()
# stack์˜ pop๊ณผ ๋˜‘๊ฐ™์ด head์—์„œ ์›์†Œ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฏ€๋กœ
	return pop()
add(x)
# tail์ชฝ์— x์ถ”๊ฐ€
	u <- new_node(x) # x๋ฅผ ๋‹ด๋Š” ์ƒˆ node ์ƒ์„ฑ
# ๋นˆ ๋ฆฌ์ŠคํŠธ๋ผ๋ฉด ์ƒˆ node๊ฐ€ head๋จ
	if n = 0 then
    	head <- u
# ๋นˆ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด tail๋’ค์— ์ƒˆ node๋ฅผ ์ถ”๊ฐ€
	else 
    	tail.next <- u
	tail <- u # ์ƒˆ node๊ฐ€ tail์ด ๋จ
    n <- n + 1
return true

๐Ÿ—ฃ๏ธ ์š”์•ฝ :

  • ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ stack๊ณผ (FIFO)queue๋ฅผ ๊ตฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • push, pop, add, remove ์—ฐ์‚ฐ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์›์†Œ ์กฐ๊ฐ ์—†์ด head๋‚˜ tail ๋ถ€๋ถ„์—์„œ ํ•˜๋‚˜์˜ ์›์†Œ๋งŒ์„ ์กฐ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(1)

  • ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ tail์„ ์ œ๊ฑฐํ•˜๋Š” ์—ฐ์‚ฐ์€ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(n).
    • tail ๋ฐ”๋กœ ์ „ ๋…ธ๋“œ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” head ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๋งํฌ๋ฅผ ๋ฐ”๋กœ ๋”ฐ๋ผ๊ฐ€๋Š” ์ˆ˜ ๋ฐ–์— ์—†์Œ.

๐Ÿ“š ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

๐Ÿ’ก์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ž€?

  • ๋…ธ๋“œ๊ฐ€ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋งํฌ์ธ u.next์™€ ์ด์ „ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” u.prev ๊ฐ’์„ ๊ฐ€์ง.
  • ๊ด€๋ จ ์—ฐ์‚ฐ ๊ตฌํ˜„ ์‹œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์˜ ์–ด๋ ค์›€์„ ์—†์• ๊ธฐ ์œ„ํ•ด dummy node๊ฐ€ ์กด์žฌ.
  • queue์—ฐ์‚ฐ (add, remove) ๊ณผ stack์—ฐ์‚ฐ (push, pop) ์„ ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•œ ์˜ˆ.
initialize()
n <- 0 # ๋นˆ DLList node๋ฅผ ๋งŒ๋“ค์–ด dummy์— ์ €์žฅ
dummy <- DLList.Node(nil)
dummy.prev <- dummy
dummy.next <- dummy
get_node(i)
# i ๋ฒˆ์งธ node๋ฅผ ๋ฆฌํ„ด
# i, n - i ์ค‘ ์ž‘์€ ๊ฐ’๋งŒํผ ํƒ์ƒ‰์ด ์ผ์–ด๋‚˜๋ฏ€๋กœ O(min{i, n - i})
# i๊ฐ€ ์ค‘์•™๋ณด๋‹ค ์™ผ์ชฝ ๊ฐ’์ด๋ฉด dummy ๋ถ€ํ„ฐ ์ˆœ๋ฐฉํ–ฅ ํƒ์ƒ‰
	if i < n/2 then
    	p <- dummy.next
        repeat i times
        	p <- p.next
# i๊ฐ€ ์ค‘์•™๋ณด๋‹ค ์˜ค๋ฅธ์ชฝ ๊ฐ’์ด๋ฉด dummy๋ถ€ํ„ฐ ์—ญ๋ฐฉํ–ฅ ํƒ์ƒ‰
	else 
    	p <- dummy
        repeat n - i times
        	p <- p.prev
	return p
get(i)
# i๋ฒˆ์งธ node๊ฐ€ ๋‹ด๊ณ  ์žˆ๋Š” ์›์†Œ๋ฅผ ๋ฆฌํ„ด
# get_node ํ˜ธ์ถœ์ด ์ผ์–ด๋‚˜๋ฏ€๋กœ O(min{i, n - i})
	return get_node(i).x
set(i,x)
# i๋ฒˆ์งธ node์— x ์ €์žฅ
# get_node ํ˜ธ์ถœ ์™ธ์—๋Š” ์ƒ์ˆ˜ ์‹œ๊ฐ„์ด๋ฏ€๋กœ O(min{i, n - i})
	u <- get_node(i) # i๋ฒˆ์งธ node๋ฅผ ์–ป์€ ๋’ค
	y <- u.x
    u.x <- x # node์— x wjwkd
    return y
add_before(w,x)
# node w์•ž์— x์ถ”๊ฐ€
	u <- DLList.Node(x) # x๋ฅผ ๋‹ด์€ node u ์ƒ์„ฑ
   	u.prev <- w.prev
    u.next <- w
    u.next.prev <- u
    u.prev.next <- u
    n <- n + 1
    return u
add(i,x)
# i๋ฒˆ์งธ์— x๊ฐ€ ์˜ค๋„๋ก ์ถ”๊ฐ€
# get_node ํ˜ธ์ถœ ์™ธ์—๋Š” ์ƒ์ˆ˜ ์‹œ๊ฐ„์ด๋ฏ€๋กœ O(min{i, n - i})
	add_before(get_node(i), x) # i ๋ฒˆ์งธ node๋ฅผ ์ฐพ์•„์„œ ๊ทธ ์•ž์— x ์ถ”๊ฐ€
remove_node(w)
# node w๋ฅผ ์‚ญ์ œ
	w.prev.next <- w.next
    w.next.prev <- w.prev
    n <- n - 1
remove(i)
# i๋ฒˆ์งธ node ์‚ญ์ œ
# get_node ํ˜ธ์ถœ ์™ธ์—๋Š” ์ƒ์ˆ˜ ์‹œ๊ฐ„์ด๋ฏ€๋กœ O(min{i, n - i})
	remove_node(get_node(i))

๐Ÿ—ฃ๏ธ ์š”์•ฝ :

  • ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” List์ธํ„ฐํŽ˜์ด์Šค(get, set, add, remove)๋ฅผ ๊ตฌํ˜„ ํ•œ๋‹ค.
    • get(i), set(i,x), add(i,x), remove(i)๋Š” O(min{i, n-i})์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.
    • get_node(i) ๋ถ€๋ถ„์‘ใ„น ์ œ์™ธํ•˜๋ฉด ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์—ฐ์‚ฐ์€ ๋ชจ๋‘ ์ƒ์ˆ˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.
      • ์ด๋Š” ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ ์ ‘๊ทผ์€ ์ƒ์ˆ˜ ์‹œ๊ฐ„์ด ๋“ค์ง€๋งŒ ์ถ”๊ฐ€๋‚˜ ์‚ญ์ œ์— ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๋ฐฐ์—ด ๊ธฐ๋ฐ˜ ๋ฆฌ์ŠคํŠธ์™€๋Š” ๋ฐ˜๋Œ€๋œ๋‹ค.
    • ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ์ธ๋ฑ์Šค๋ณด๋‹ค๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์ฃผ์–ด์ง€๋Š” ์ƒํ™ฉ์—์„œ ๋” ์œ ๋ฆฌํ•˜๋‹ค.

profile
์‹œ๊ฐ์ ์ธ ์ฝ”๋”ฉ์„ ์ฆ๊ธฐ๋Š” ๊ฐœ๋ฐœ์ž ์ง€๋ง์ƒ ์ฑ„์˜๋ฏผ ์ž…๋‹ˆ๋‹ค;
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€