[์ค์ํํธ ์๊ณ ๋ฆฌ์ฆ] ํ๋ก๊ทธ๋๋จธ์ค: ํ ํธ์ง
๋ฌธ์
https://programmers.co.kr/learn/courses/30/lessons/81303
[๋ณธ ๋ฌธ์ ๋ ์ ํ์ฑ๊ณผ ํจ์จ์ฑ ํ ์คํธ ๊ฐ๊ฐ ์ ์๊ฐ ์๋ ๋ฌธ์ ์ ๋๋ค.]
์ ๋ฌด์ฉ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๋ ๋๋์ฆ์์ค์ ์ธํด์ธ ์๋ชฌ๋๋ ๋ช ๋ น์ด ๊ธฐ๋ฐ์ผ๋ก ํ์ ํ์ ์ ํ, ์ญ์ , ๋ณต๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๊ณผ์ ๋ฅผ ๋งก์์ต๋๋ค. ์ธ๋ถ ์๊ตฌ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค
์ ๊ทธ๋ฆผ์์ ํ๋์์ผ๋ก ์น ํด์ง ์นธ์ ํ์ฌ ์ ํ๋ ํ์ ๋ํ๋ ๋๋ค. ๋จ, ํ ๋ฒ์ ํ ํ๋ง ์ ํํ ์ ์์ผ๋ฉฐ, ํ์ ๋ฒ์(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: "")
์นด์นด์ค ์ธํด์ญ ์ฝํ ์์ ์ด ๋ฌธ์ ๋ฅผ ํ๋ค๊ฐ ์๊ฐ์ด ์ข ๋ฃ๋์๋๋ฐ, ์ด๋ฒ์๋ ์ญ์ ์์ฒญ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค. ๊ทธ๋๋ ๋๋ถ์ ๋งํฌ๋ ๋ฆฌ์คํธ๋ ๋ค์ ๊ตฌํํด๋ณผ ์ ์๊ณ ๋ง์ ๊ณต๋ถ๊ฐ ๋์์ต๋๋ค!
์ฝ๋
'๐๐ปโโ๏ธ ํผ-์์ค > ๐ฃ ํ๋ก๊ทธ๋๋จธ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ค์ํํธ ์๊ณ ๋ฆฌ์ฆ] ๊ฒฝ์ฃผ๋ก ๊ฑด์ค (0) | 2021.10.24 |
---|---|
[์ค์ํํธ ์๊ณ ๋ฆฌ์ฆ] ๊ธฐ์ง๊ตญ ์ค์น (0) | 2021.10.10 |
[์ค์ํํธ ์๊ณ ๋ฆฌ์ฆ] ํ๋ก๊ทธ๋๋จธ์ค: ์ฌ ์ฐ๊ฒฐํ๊ธฐ (0) | 2021.10.03 |
[์ค์ํํธ ์๊ณ ๋ฆฌ์ฆ] ํ๋ก๊ทธ๋๋จธ์ค: ์ฌํ๊ฒฝ๋ก (0) | 2021.10.03 |
[์ค์ํํธ ์๊ณ ๋ฆฌ์ฆ] ํ๋ก๊ทธ๋๋จธ์ค: ๋ฒ ์คํธ์จ๋ฒ (0) | 2021.10.03 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote