-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathboj_01021.swift
107 lines (87 loc) · 2.64 KB
/
boj_01021.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// 2022.05.11
// Dongyoung Kwon @Chuncheonian ([email protected])
// https://www.acmicpc.net/problem/1021
let nm = readLine()!.split{ $0 == " " }.map{ Int(String($0))! }
var searchArr = readLine()!.split{ $0 == " " }.map{ Int(String($0))! }
var deque: Deque<Int> = .init(Array(1...nm[0]))
var result = 0
for search in searchArr {
if deque.front! == search {
_ = deque.dequeue()
} else {
if deque.firstIndex(of: search)! <= (deque.count / 2) {
while deque.front! != search {
deque.enqueue(deque.dequeue()!)
result += 1
}
_ = deque.dequeue()
} else {
while deque.front! != search {
deque.enqueueFront(deque.dequeueBack()!)
result += 1
}
_ = deque.dequeue()
}
}
}
print(result)
struct Deque<T: Equatable> {
private var enqueueStack: [T]
private var dequeueStack: [T] = []
var count: Int {
return enqueueStack.count + dequeueStack.count
}
var isEmpty: Bool {
return enqueueStack.isEmpty && dequeueStack.isEmpty
}
var front: T? {
return dequeueStack.isEmpty ? enqueueStack.first : dequeueStack.last
}
var back: T? {
return enqueueStack.isEmpty ? dequeueStack.first : enqueueStack.last
}
init(_ queue: [T] = []) {
self.enqueueStack = queue
}
mutating func enqueue(_ element: T) {
enqueueStack.append(element)
}
mutating func enqueueFront(_ element: T) {
dequeueStack.append(element)
}
mutating func dequeue() -> T? {
if dequeueStack.isEmpty {
dequeueStack = enqueueStack.reversed()
enqueueStack.removeAll()
}
return dequeueStack.popLast()
}
mutating func dequeueBack() -> T? {
var value: T?
if enqueueStack.isEmpty {
dequeueStack.reverse()
value = dequeueStack.popLast()
dequeueStack.reverse()
} else {
value = enqueueStack.popLast()
}
return value
}
mutating func removeAll() {
enqueueStack.removeAll()
dequeueStack.removeAll()
}
mutating func firstIndex(of element: T) -> Int? {
if dequeueStack.isEmpty {
return enqueueStack.firstIndex(of: element)
}
dequeueStack.reverse()
if let index = dequeueStack.firstIndex(of: element) {
dequeueStack.reverse()
return .some(index)
} else {
dequeueStack.reverse()
return .some(dequeueStack.count + enqueueStack.firstIndex(of: element)!)
}
}
}