๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

๋ฌธ์ œ

https://programmers.co.kr/learn/courses/30/lessons/81303

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ํ‘œ ํŽธ์ง‘

8 2 ["D 2","C","U 3","C","D 4","C","U 2","Z","Z"] "OOOOXOOO" 8 2 ["D 2","C","U 3","C","D 4","C","U 2","Z","Z","U 1","C"] "OOXOXOOO"

programmers.co.kr

[๋ณธ ๋ฌธ์ œ๋Š” ์ •ํ™•์„ฑ๊ณผ ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ ๊ฐ๊ฐ ์ ์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.]

์—…๋ฌด์šฉ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋‹ˆ๋‹ˆ์ฆˆ์›์Šค์˜ ์ธํ„ด์ธ ์•™๋ชฌ๋“œ๋Š” ๋ช…๋ น์–ด ๊ธฐ๋ฐ˜์œผ๋กœ ํ‘œ์˜ ํ–‰์„ ์„ ํƒ, ์‚ญ์ œ, ๋ณต๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ œ๋ฅผ ๋งก์•˜์Šต๋‹ˆ๋‹ค. ์„ธ๋ถ€ ์š”๊ตฌ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค

์œ„ ๊ทธ๋ฆผ์—์„œ ํŒŒ๋ž€์ƒ‰์œผ๋กœ ์น ํ•ด์ง„ ์นธ์€ ํ˜„์žฌ ์„ ํƒ๋œ ํ–‰์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋‹จ, ํ•œ ๋ฒˆ์— ํ•œ ํ–‰๋งŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ‘œ์˜ ๋ฒ”์œ„(0ํ–‰ ~ ๋งˆ์ง€๋ง‰ ํ–‰)๋ฅผ ๋ฒ—์–ด๋‚  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ํ‘œ๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

  • "U X": ํ˜„์žฌ ์„ ํƒ๋œ ํ–‰์—์„œ X์นธ ์œ„์— ์žˆ๋Š” ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • "D X": ํ˜„์žฌ ์„ ํƒ๋œ ํ–‰์—์„œ X์นธ ์•„๋ž˜์— ์žˆ๋Š” ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • "C" : ํ˜„์žฌ ์„ ํƒ๋œ ํ–‰์„ ์‚ญ์ œํ•œ ํ›„, ๋ฐ”๋กœ ์•„๋ž˜ ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ์‚ญ์ œ๋œ ํ–‰์ด ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ํ–‰์ธ ๊ฒฝ์šฐ ๋ฐ”๋กœ ์œ— ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • "Z" : ๊ฐ€์žฅ ์ตœ๊ทผ์— ์‚ญ์ œ๋œ ํ–‰์„ ์›๋ž˜๋Œ€๋กœ ๋ณต๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ํ˜„์žฌ ์„ ํƒ๋œ ํ–‰์€ ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์œ„ ํ‘œ์—์„œ "D 2"๋ฅผ ์ˆ˜ํ–‰ํ•  ๊ฒฝ์šฐ ์•„๋ž˜ ๊ทธ๋ฆผ์˜ ์™ผ์ชฝ์ฒ˜๋Ÿผ 4ํ–‰์ด ์„ ํƒ๋˜๋ฉฐ, "C"๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์„ ํƒ๋œ ํ–‰์„ ์‚ญ์ œํ•˜๊ณ , ๋ฐ”๋กœ ์•„๋ž˜ ํ–‰์ด์—ˆ๋˜ "๋„ค์˜ค"๊ฐ€ ์ ํžŒ ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค(4ํ–‰์ด ์‚ญ์ œ๋˜๋ฉด์„œ ์•„๋ž˜ ์žˆ๋˜ ํ–‰๋“ค์ด ํ•˜๋‚˜์”ฉ ๋ฐ€๋ ค ์˜ฌ๋ผ์˜ค๊ณ , ์ˆ˜์ •๋œ ํ‘œ์—์„œ ๋‹ค์‹œ 4ํ–‰์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค).

๋‹ค์Œ์œผ๋กœ "U 3"์„ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ "C"๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„์˜ ํ‘œ ์ƒํƒœ๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ "D 4"๋ฅผ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ "C"๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„์˜ ํ‘œ ์ƒํƒœ๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 5ํ–‰์ด ํ‘œ์˜ ๋งˆ์ง€๋ง‰ ํ–‰ ์ด๋ฏ€๋กœ, ์ด ๊ฒฝ์šฐ ๋ฐ”๋กœ ์œ— ํ–‰์„ ์„ ํƒํ•˜๋Š” ์ ์— ์ฃผ์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ "U 2"๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ํ˜„์žฌ ์„ ํƒ๋œ ํ–‰์€ 2ํ–‰์ด ๋ฉ๋‹ˆ๋‹ค.

์œ„ ์ƒํƒœ์—์„œ "Z"๋ฅผ ์ˆ˜ํ–‰ํ•  ๊ฒฝ์šฐ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ œ๊ฑฐ๋œ "๋ผ์ด์–ธ"์ด ์ ํžŒ ํ–‰์ด ์›๋ž˜๋Œ€๋กœ ๋ณต๊ตฌ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œํ•œ๋ฒˆ "Z"๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๊ทธ ๋‹ค์Œ์œผ๋กœ ์ตœ๊ทผ์— ์ œ๊ฑฐ๋œ "์ฝ˜"์ด ์ ํžŒ ํ–‰์ด ์›๋ž˜๋Œ€๋กœ ๋ณต๊ตฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ํ˜„์žฌ ์„ ํƒ๋œ ํ–‰์€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ์ ์— ์ฃผ์˜ํ•˜์„ธ์š”.

์ด๋•Œ, ์ตœ์ข… ํ‘œ์˜ ์ƒํƒœ์™€ ์ฒ˜์Œ ์ฃผ์–ด์ง„ ํ‘œ์˜ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์‚ญ์ œ๋˜์ง€ ์•Š์€ ํ–‰์€ "O", ์‚ญ์ œ๋œ ํ–‰์€ "X"๋กœ ํ‘œ์‹œํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ ํ‘œ์˜ ํ–‰ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ n, ์ฒ˜์Œ์— ์„ ํƒ๋œ ํ–‰์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ k, ์ˆ˜ํ–‰ํ•œ ๋ช…๋ น์–ด๋“ค์ด ๋‹ด๊ธด ๋ฌธ์ž์—ด ๋ฐฐ์—ด cmd๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋ชจ๋“  ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„ ํ‘œ์˜ ์ƒํƒœ์™€ ์ฒ˜์Œ ์ฃผ์–ด์ง„ ํ‘œ์˜ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์‚ญ์ œ๋˜์ง€ ์•Š์€ ํ–‰์€ O, ์‚ญ์ œ๋œ ํ–‰์€ X๋กœ ํ‘œ์‹œํ•˜์—ฌ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

ํ’€์ด

ํšจ์œจ์„ฑ๊นŒ์ง€ ํ†ต๊ณผํ•˜๊ธฐ์— ์–ด๋ ค์šด ๋ฌธ์ œ์—ฟ์Šต๋‹ˆ๋‹คใ…  ๋‹ค ํ‘ธ๋Š”๋ฐ 2์‹œ๊ฐ„์€ ๊ฑธ๋ฆฐ๊ฒƒ ๊ฐ™๋„ค์š”.. 

 

์ด ๋ฌธ์ œ๋ฅผ ํšจ์œจ์„ฑ๊นŒ์ง€ ํ†ต๊ณผํ•˜๋ ค๋ฉด ์ ˆ๋Œ€๋กœ O(N) ์ด์ƒ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์–‘๋ฐฉํ–ฅ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋™์‹œ์— ๊ธฐ์กด์˜ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์™€๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผํ•˜๋Š” ๋ถ€๋ถ„๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

Node ๊ตฌ์กฐ

๋จผ์ €, ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ž์‹ ์˜ ํ‘œ ์ธ๋ฑ์Šค ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์— ์ตœ์ดˆ์˜ ํ‘œ์—์„œ ๋‹ฌ๋ผ์ง„ ๋ถ€๋ถ„๋งŒ์„ ํ‘œ์‹œํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋…ธ๋“œ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

class Node {
    var data: Int?
    var next: Node?
    var prev: Node?
    
    init(data: Int, next: Node?, prev: Node?) {
        self.data = data
        self.next = next
        self.prev = prev
    }
}

 

data์—๋Š” ์ธ๋ฑ์Šค๋ฅผ ๋„ฃ๊ณ , next์™€ prev์— ์ž์‹ ์˜ ๋‹ค์Œ, ์ด์ „ ๋…ธ๋“œ์˜ ์ฐธ์กฐ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. 

 

๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ

์ด์ œ ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š”๋ฐ์š”, ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • ์‚ญ์ œ๋œ ํ–‰์˜ ์ •๋ณด (isDeleted)
  • ๊ฐ€์žฅ ์•ž ๋…ธ๋“œ์˜ ํฌ์ธํ„ฐ(head)
  • ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์˜ ํฌ์ธํ„ฐ(tail)
  • ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋…ธ๋“œ(cursor)

๊ทธ๋ฆฌ๊ณ  ์ด ๋ฌธ์ œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์€ ์ด 4 ์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค. 

  • ์ƒˆ๋กœ์šด ๋…ธ๋“œ ์‚ฝ์ž…ํ•˜๊ธฐ
  • ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ 
  • ์‚ญ์ œ ํ–ˆ๋˜ ๋…ธ๋“œ๋ฅผ ์›๋ž˜์ž๋ฆฌ์— ๋ณต์›ํ•˜๊ธฐ
  • ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ 

 

๋…ธ๋“œ ์‚ฝ์ž…

๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ€์žฅ ์•ž์„ ๋‚˜ํƒ€๋‚ด๋Š” head๋งŒ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ๋•Œ๋งˆ๋‹ค ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊นŒ์ง€ ํƒ์ƒ‰ํ•ด์•ผํ•˜๋Š” O(N) ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— tail์ด๋ผ๋Š” ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ญ์ƒ ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋Š” tail์˜ ๋’ค์— ๋ถ™์—ฌ์ฃผ๊ณ  tail์„ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฝ์ž…์—ฐ์‚ฐ์„ O(1)๋งŒ์— ๋๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

mutating func append(data: Int, isInitCursor: Bool) {
        let node = Node(data: data, next: nil, prev: nil)
        if isInitCursor { cursor = node }
        
        if head == nil {
            head = node
            tail = node
        } else {
            node.prev = tail
            tail?.next = node
            tail = node
        }
        isDeleted.append(false)
    }

 

๋…ธ๋“œ ์‚ญ์ œ

๋…ธ๋“œ์˜ ์‚ญ์ œ๋Š” ์–ด๋–ค ํŠน์ •ํ•œ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ , ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๊ณ  cursor์— ์ €์žฅ๋œ ์ฐธ์กฐ๊ฐ’์„ ์ฐพ์•„๊ฐ€ ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ด์ „๋…ธ๋“œ์™€ ๋‹ค์Œ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ์ด๋ฒˆ์—๋„ O(1)๋งŒ์— ์‚ญ์ œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ญ์ œ๊ฐ€ ๋๋‚œ ์ดํ›„์—๋Š” ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ์ธ๋ฑ์Šค ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ํ–‰์ด ์‚ญ์ œ๋˜์—ˆ์Œ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

 

mutating func remove() -> Node? {
        let delNode = cursor
        
        cursor?.next?.prev = cursor?.prev
        cursor?.prev?.next = cursor?.next
        cursor = delNode?.next == nil ? delNode?.prev : delNode?.next
        
        isDeleted[delNode!.data!] = true
        return delNode
    }

 

๋…ธ๋“œ ๋ณต์› 

๋…ธ๋“œ์˜ ๋ณต์›์€ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์›ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ์ด์ „๋…ธ๋“œ์™€ ๋‹ค์Œ๋…ธ๋“œ์˜ ์ฐธ์กฐ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์›ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ญ์ œ๋˜์—ˆ๋˜ ๋…ธ๋“œ๊ฐ€ ๋‹ค์‹œ ๋ณต์›๋˜์—ˆ์Œ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

 

    mutating func restore(node: Node?) {
        node?.prev?.next = node
        node?.next?.prev = node
        isDeleted[node!.data!] = false
    }

 

์ปค์„œ ์ด๋™ 

์ปค์„œ๋ฅผ ์ด๋™ํ•  ๋•Œ๋Š” ์ฃผ์–ด์ง€๋Š” ๊ฐ’๋งŒํผ ํฌ์ธํ„ฐ๋ฅผ ์ด๋™์‹œ์ผœ์ค๋‹ˆ๋‹ค. ์–‘๋ฐฉํ–ฅ ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์œ„๋กœ ์˜ฌ๋ผ๊ฐˆ๋•Œ๋Š” ์ด์ „ ๋…ธ๋“œ๋“ค์„ ํƒ์ƒ‰ํ•˜๊ณ , ๋‚ด๋ ค๊ฐˆ ๋•Œ๋Š” ๋‹ค์Œ๋…ธ๋“œ๋“ค์„ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ์—์„œ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์ด๋™์€ ์ž…๋ ฅ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ฃผ์–ด์ ธ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ์ด ์—ฐ์‚ฐ์€ ์ฃผ์–ด์ง€๋Š” ์ด๋™๊ฐ’ x๋งŒํผ์˜ O(x) ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

 

    mutating func moveUp(to amount: Int) {
        for _ in 0..<amount {
            cursor = cursor?.prev
        }
    }
    
    mutating func moveDown(to amount: Int) {
        for _ in 0..<amount {
            cursor = cursor?.next
        }
    }

 

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ชจ๋“  ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ ๋’ค์—๋„ ์‚ญ์ œ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ๋“ค์„ ๊ตฌ๋ถ„ํ•ด์„œ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค!

 

return table.isDeleted.map({ $0 ? "X" : "O" }).joined(separator: "")

 

์นด์นด์˜ค ์ธํ„ด์‹ญ ์ฝ”ํ…Œ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ’€๋‹ค๊ฐ€ ์‹œ๊ฐ„์ด ์ข…๋ฃŒ๋˜์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ์—๋„ ์—ญ์‹œ ์—„์ฒญ ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋•๋ถ„์— ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด๋ณผ ์ˆ˜ ์žˆ๊ณ  ๋งŽ์€ ๊ณต๋ถ€๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

 

์ฝ”๋“œ