์๋ ํ์ธ์ ์ ์ธ์ ๋๋ค :)
์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ํ์ฉํ๋ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๊ฒ ๋์ด ํด๋น ๋ด์ฉ์ ๋ํด ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋๋ฐ์,
<ํ๋ก๊ทธ๋๋จธ์ค(Lv.3) - ํ ํธ์ง> ๋ฌธ์ ๋ฅผ ํ์ดํ๋ฉฐ ์ฐ๊ฒฐ๋ฆฌ์คํธ(LinkedList)๋ฅผ Swift๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค!
๋ฌธ์ ๋งํฌ
๋ฌธ์ ํ์ด
์ฒ์ ์ ๊ทผ
์ ๋ ์ฒ์๋ถํฐ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์จ์ผ๊ฒ ๋ค๋ ์์ด๋์ด๋ฅผ ๋ ์ฌ๋ฆฌ์ง ๋ชปํด ํ ๋ฒ์ ๋ง์ถ์ง ๋ชปํ์ต๋๋ค,,
์ ํ๋ ํ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ๋๊ณ ๋ช ๋ น์ด ์ผ์ด์ค์ ๋ฐ๋ผ ์๋ง์ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋๋ก(ํฌ์ธํฐ ์ด๋, ์ญ์ ๋ ํ ์ธ๋ฑ์ค ๊ธฐ๋ก ๋ฑ) ํฌ์ธํฐ๋ฅผ ์ด์ฉํด ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํ์ด๋ฅผ ํ์์ต๋๋ค. ํ์ง๋ง, ์ฝ์ , ์ญ์ ์ฐ์ฐ ์์ด ๋จ์ํ ํฌ์ธํฐ๋ง์ผ๋ก ๋ช ๋ น์ด์ ๋ฐ๋ฅธ ํ ์ด๋ธ์ ๋ณํ๋ฅผ ๊ธฐ๋กํ๋ ค๊ณ ํ๋ ์์ธ ์ํฉ์ ๋ค ๋ฐ์ ธ์ค์ผํ๋ ์ฝ๋๊ฐ ๋ณต์กํด์ง๊ณ ๊ผฌ์ด๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ๊ทธ๋ ๋ค๊ณ ๋ฐฐ์ด์ ์ด์ฉํด ์ฝ์ , ์ญ์ ์ฐ์ฐ์ ๊ตฌํํ์๋ ํจ์จ์ฑ ํ ์คํธ์์ ์คํจํ ๊ฒ์ด ๋ปํ๋๋ผ๊ตฌ์๐ฅบ ๊ฒฐ๊ตญ ์ด ๋ฌธ์ ๋ ๋ฐฐ์ด๋ณด๋ค ๋ ํจ์จ์ ์ธ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฐพ์ ๊ตฌํํด์ผ ํ๋ ๋ฌธ์ ์ธ๋ฐ์,
Array๋ณด๋ค ๋ฐ์ดํฐ ์ฝ์ , ์ญ์ ๋ฅผ ๋ ๋น ๋ฅด๊ฒ ํ ์ ์๋ ์๋ฃ๊ตฌ์กฐ์ธ LinkedList๋ฅผ ํ์ฉํด์ ์ด ๋ฌธ์ ๋ฅผ ํ์ดํ ์ ์์ต๋๋ค!
LinkedList๋ฅผ ์ด์ฉํ ํ์ด ๋ฐฉ๋ฒ
ํด๋น ๋ฌธ์ ์์๋ ํ ์ด๋ธ์ ์ค๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ณ ๋ค์ ๋ณต๊ตฌํ๋ ๋ฑ์ ์ฐ์ฐ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ ์ค์์๋ ์๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํด์ ๋ฌธ์ ๋ฅผ ํ์ดํด์ผํฉ๋๋ค. ์๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํ๊ธฐ์ ์์ ๋ ธ๋๋ ์ด๋ป๊ฒ ๊ตฌ์ฑํ๋ฉด ์ข์์ง(์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ด์์ง), ์ด๋ค ์ฐ์ฐ์ด ํ์ํ์ง๋ฅผ ๋จผ์ ์ฒดํฌํด์ผ๊ฒ ์ฃ ?
1. ๋ ธ๋ ๊ตฌ์ฑ
์๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ตฌํํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด์ ๋ ธ๋์ ๋ค์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ(prev, next)๊ฐ ํ๋์ฉ ํ์ํ ๊ฒ์ด๊ณ , ๋ฐ์ดํฐ ํ๋์๋ ํ ๋ฒํธ๋ฅผ ์ ์ฅํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ Int ํ์ ์ผ๋ก ์ ์ธํด์ฃผ๋ฉด ๋ฉ๋๋ค.
class Node {
var index: Int?
var next: Node?
var prev: Node?
init(index: Int, next: Node?, prev: Node?) {
self.index = index
self.next = next
self.prev = prev
}
}
2. ์ฐ์ฐ์ ์ข ๋ฅ
ํด๋น ๋ฌธ์ ๋ฅผ ํ์ดํ๊ธฐ ์ํด ํ์ํ ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์๋ก์ด ๋ ธ๋ ์ฝ์ (์ด๊ธฐ ํ ์ด๋ธ์ LinkedList๋ก ๊ตฌ์ฑํ๊ธฐ ์ํด)
- ํ์ฌ ๊ฐ๋ฆฌํค๊ณ ์๋ ๋ ธ๋ ์ญ์ (๋ช ๋ น์ด C์ ํด๋น)
- ๋ง์ง๋ง์ผ๋ก ์ญ์ ํ ๋ ธ๋ ๋ณต์ (๋ช ๋ น์ด Z์ ํด๋น)
- ์ ํ๋ ํ ์์๋๋ก ์ด๋ (๋ช ๋ น์ด U, D์ ํด๋น)
LinkedList ํด๋์ค์ ์์ ๊ฐ์ด ํ์ํ ์ฐ์ฐ๋ค์ ํจ์๋ก ๋ง๋ค์ด๋๊ณ , solution ํจ์ ์์์ switch ๋ฌธ์ ์ด์ฉํด ๊ฐ ๋ช ๋ น์ด์ ํด๋นํ๋ ์ฐ์ฐ์ ํด์ ์ต์ข ์ ์ธ ๊ฐ์ ๋์ถํ๋๋ก ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ๊ตฌ์ฑํ์ต๋๋ค. ์ฃผ์์ ๊ฐ ํจ์๋ ์ฝ๋์ ๋ํ ๊ฐ๋จํ ์ค๋ช ๋ ํจ๊ป ์จ๋์์ผ๋ ์ฐธ๊ณ ํ๋ฉด ์ฝ๊ฒ ์ดํด๊ฐ ๊ฐ ๊ฒ ๊ฐ์์!(์ดํดํ๋ ๋ฐ ํฌ๊ฒ ์ด๋ ค์์ ์์ ๊ฒ ๊ฐ์์ ์ฝ๋์ ๋ํ ์์ธํ ์ค๋ช ์ ์๋ตํ๊ฒ ์ต๋๋ค.)
+ ํด๋น ๋ฌธ์ ์ ๊ฒฝ์ฐ, ํ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์ด๋์ ์ฃผ์ด์ง์ง ์๋๋ค๋ ์กฐ๊ฑด์ด ์๊ธฐ ๋๋ฌธ์ ์ ํ๋๋ ํ์ ์ด๋ํ๋ ์ฐ์ฐ(remove(), moveUp(), moveDown()์ ํฌํจ)์์ ํ ์ด๋ธ์ ์ธ๋ฑ์ค๋ฅผ ๋ฒ์ด๋ฌ์ ๋์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ง ์์๋๋ฐ์, ๋ง์ฝ ์ด๋ฌํ ์กฐ๊ฑด์ด ์๋ค๋ฉด head์ tail์ด nil์ธ์ง๋ฅผ ์ฒดํฌํด ์ ์ ํ ํ์ด ์ ํ๋ ์ ์๋๋ก ํ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ ๊ฒ ๊ฐ๋ค์!
Swift ํ์ด ์ฝ๋
import Foundation
class Node {
var index: Int?
var next: Node?
var prev: Node?
init(index: Int, next: Node?, prev: Node?) {
self.index = index
self.next = next
self.prev = prev
}
}
class LinkedList {
var head: Node?
var tail: Node?
var cursor: Node?
var isDeleted: [Bool] = []
// ์๋ก์ด ๋
ธ๋ ์ฝ์
func append(index: Int, isInitCursor: Bool) {
let node = Node(index: index, next: nil, prev: nil)
if isInitCursor { cursor = node } // ๊ฐ๋ฆฌํค๊ณ ์๋ ๋
ธ๋ ์ค์
if head == nil {
head = node
tail = node
} else { // ๋ค์ ์ฝ์
(์ฝ์
๋๋ ๋
ธ๋๊ฐ ์๋ก์ด tail์ด ๋จ)
node.prev = tail
tail?.next = node
tail = node
}
isDeleted.append(false)
}
// ํ์ฌ ๊ฐ๋ฆฌํค๊ณ ์๋ ๋
ธ๋ ์ญ์
func remove() -> Node? {
let deleteNode = cursor
cursor?.next?.prev = cursor?.prev
cursor?.prev?.next = cursor?.next
// ๋ง์ง๋ง ๋
ธ๋์ด๋ฉด ์ปค์๋ฅผ ์๋
ธ๋๋ก ์ค์
cursor = deleteNode?.next == nil ? deleteNode?.prev : deleteNode?.next
isDeleted[deleteNode!.index!] = true
return deleteNode
}
// ์ด์ ์ญ์ ๋
ธ๋ ๋ณต์
func restore(node: Node?) {
node?.prev?.next = node
node?.next?.prev = node
isDeleted[node!.index!] = false
}
// ์ปค์ num๋งํผ ์๋ก ์ด๋
func moveUp(to num: Int) {
for _ in 0..<num {
cursor = cursor?.prev
}
}
// ์ปค์ num๋งํผ ์๋๋ก ์ด๋
func moveDown(to num: Int) {
for _ in 0..<num {
cursor = cursor?.next
}
}
}
func solution(_ n:Int, _ k:Int, _ cmd:[String]) -> String {
var table = LinkedList()
var deleteStack: [Node?] = []
for i in 0..<n {
table.append(index: i, isInitCursor: i == k)
}
for command in cmd {
let splitCommand = command.split(separator: " ")
switch splitCommand[0] {
case "D":
table.moveDown(to: Int(splitCommand[1])!)
case "U":
table.moveUp(to: Int(splitCommand[1])!)
case "C":
deleteStack.append(table.remove())
case "Z":
table.restore(node: deleteStack.removeLast())
default:
break
}
}
return table.isDeleted.map({ $0 ? "X" : "O" }).joined(separator: "")
}
[์ฐธ๊ณ ์๋ฃ]
'๐ฅ CS > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm/Swift] ํ๋ก๊ทธ๋๋จธ์ค(Lv.2) - ํ๋ฐฐ ๋ฐฐ๋ฌ๊ณผ ์๊ฑฐํ๊ธฐ (0) | 2024.04.16 |
---|---|
[Algorithm/Swift] BOJ(๊ณจ๋4) - 2573 ๋น์ฐ (2) | 2023.12.26 |
[Algorithm/Swift] ํ๋ก๊ทธ๋๋จธ์ค(Lv.3) - ํ๊ดด๋์ง ์์ ๊ฑด๋ฌผ (0) | 2023.08.14 |
[Algorithm/Swift] ํ๋ก๊ทธ๋๋จธ์ค(Lv.3) - ์คํฐ์ปค ๋ชจ์ผ๊ธฐ(2) (3) | 2023.05.01 |
[Algorithm/Swift] ํ๋ก๊ทธ๋๋จธ์ค(Lv.3) - ์ ๊ตญ์ฌ์ฌ (2) | 2023.04.05 |