링크: https://school.programmers.co.kr/learn/courses/30/lessons/81303
Node 클래스를 만들어 풀었습니다. 삭제/삽입은 연결리스트의 방식과 동일합니다.
맨 처음 노드의 prev은 nil이고 맨 마지막 노드의 next는 nil인 것만 조심하면 됩니다.
import Foundation
class Node {
let number: Int
var prev: Node?
var next: Node?
var isRemoved = false
init(number: Int, prev: Node?, next: Node?) {
self.number = number
self.prev = prev
self.next = next
}
}
func solution(_ n: Int, _ k: Int, _ cmds: [String]) -> String {
var nodes = [Node]()
for i in 0..<n {
let newNode = Node(number: i, prev: nil, next: nil)
if !nodes.isEmpty {
let prev = nodes.last!
prev.next = newNode
newNode.prev = prev
}
nodes.append(newNode)
}
var currentNode = nodes[k]
var removed = [Node]()
for cmd in cmds {
let array = cmd.split(separator: " ")
if array[0] == "U" {
for _ in 0..<Int(array[1])! {
currentNode = currentNode.prev!
}
} else if array[0] == "D" {
for _ in 0..<Int(array[1])! {
currentNode = currentNode.next!
}
} else if array[0] == "C" {
currentNode.isRemoved = true
removed.append(currentNode)
let prev = currentNode.prev
let next = currentNode.next
if next == nil { // 삭제된 행이 가장 마지막 행인 경우 바로 윗 행을 선택합니다.
prev!.next = nil
currentNode = prev!
} else {
prev?.next = next
next!.prev = prev
currentNode = next!
}
} else if array[0] == "Z" {
let last = removed.removeLast()
last.isRemoved = false
let prev = last.prev
let next = last.next
prev?.next = last
next?.prev = last
}
}
var result = ""
for i in 0..<nodes.count {
if nodes[i].isRemoved {
result.append("X")
} else {
result.append("O")
}
}
return result
}
'알고리즘' 카테고리의 다른 글
[Swift] 깊이 우선 탐색(DFS)과 간선의 분류 (0) | 2022.07.27 |
---|---|
[Swift] 백준 16113번 시그널 (0) | 2022.07.10 |
[Swift] 프로그래머스 - 카카오 기둥과 보 설치 (0) | 2022.06.27 |
[Swift] 프로그래머스 - 카카오 괄호 변환 (0) | 2022.06.27 |
[Swift] 백준 1992번 쿼드트리 (0) | 2022.05.11 |
댓글