문제
정수를 저장하는 덱을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 여덟 가지이다.
- 1 X: 정수 X를 덱의 앞에 넣는다. (1 ≤ X ≤ 100,000)
- 2 X: 정수 X를 덱의 뒤에 넣는다. (1 ≤ X ≤ 100,000)
- 3: 덱에 정수가 있다면 맨 앞의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.
- 4: 덱에 정수가 있다면 맨 뒤의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.
- 5: 덱에 들어있는 정수의 개수를 출력한다.
- 6: 덱이 비어있으면 1, 아니면 0을 출력한다.
- 7: 덱에 정수가 있다면 맨 앞의 정수를 출력한다. 없다면 -1을 대신 출력한다.
- 8: 덱에 정수가 있다면 맨 뒤의 정수를 출력한다. 없다면 -1을 대신 출력한다.
입력
첫째 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 1,000,000)
둘째 줄부터 N개 줄에 명령이 하나씩 주어진다.
출력을 요구하는 명령은 하나 이상 주어진다.
출력
출력을 요구하는 명령이 주어질 때마다 명령의 결과를 한 줄에 하나씩 출력한다.
내가 푼 풀이
- 덱을 구현해서 해당 명령어를 실행하면 된다.
- 명령수가 많아서 입출력코드를 이용했다
import Foundation
final class FileIO {
private let buffer:[UInt8]
private var index: Int = 0
init(fileHandle: FileHandle = FileHandle.standardInput) {
buffer = Array(try! fileHandle.readToEnd()!)+[UInt8(0)] // 인덱스 범위 넘어가는 것 방지
}
@inline(__always) private func read() -> UInt8 {
defer { index += 1 }
return buffer[index]
}
@inline(__always) func readInt() -> Int {
var sum = 0
var now = read()
var isPositive = true
while now == 10
|| now == 32 { now = read() } // 공백과 줄바꿈 무시
if now == 45 { isPositive.toggle(); now = read() } // 음수 처리
while now >= 48, now <= 57 {
sum = sum * 10 + Int(now-48)
now = read()
}
return sum * (isPositive ? 1:-1)
}
@inline(__always) func readString() -> String {
var now = read()
while now == 10 || now == 32 { now = read() } // 공백과 줄바꿈 무시
let beginIndex = index-1
while now != 10,
now != 32,
now != 0 { now = read() }
return String(bytes: Array(buffer[beginIndex..<(index-1)]), encoding: .ascii)!
}
@inline(__always) func readByteSequenceWithoutSpaceAndLineFeed() -> [UInt8] {
var now = read()
while now == 10 || now == 32 { now = read() } // 공백과 줄바꿈 무시
let beginIndex = index-1
while now != 10,
now != 32,
now != 0 { now = read() }
return Array(buffer[beginIndex..<(index-1)])
}
}
// 덱
struct Deque<T> {
var enqueue: [T]
var dequeue: [T] = []
init(enqueue: [T]) {
self.enqueue = enqueue
}
var count: Int {
return enqueue.count + dequeue.count
}
var isEmpty: Bool {
return enqueue.isEmpty && dequeue.isEmpty
}
mutating func first() -> T? {
if dequeue.isEmpty {
dequeue = enqueue.reversed()
enqueue.removeAll()
}
return dequeue.last
}
mutating func last() -> T? {
if enqueue.isEmpty {
if dequeue.isEmpty {
return nil
} else {
return dequeue[0]
}
} else {
return enqueue.last
}
}
mutating func pushFront(_ element: T) {
dequeue.append(element)
}
mutating func pushRear(_ element: T) {
enqueue.append(element)
}
mutating func popFront() -> T? {
if dequeue.isEmpty {
dequeue = enqueue.reversed()
enqueue.removeAll()
}
return dequeue.popLast()
}
mutating func popRear() -> T? {
if enqueue.isEmpty {
enqueue = dequeue.reversed()
dequeue.removeAll()
}
return enqueue.popLast()
}
}
let fIO = FileIO()
let N = fIO.readInt()
var dq = Deque(enqueue: [Int]())
for i in 0..<N {
let op = fIO.readInt()
switch op {
case 1:
let element = fIO.readInt()
dq.pushFront(element)
case 2:
let element = fIO.readInt()
dq.pushRear(element)
case 3:
if let popFir = dq.popFront() {
print(popFir)
} else {
print(-1)
}
case 4:
if let popLas = dq.popRear() {
print(popLas)
} else {
print(-1)
}
case 5:
print(dq.count)
case 6:
print(dq.isEmpty ? 1 : 0)
case 7:
if let fir = dq.first() {
print(fir)
} else {
print(-1)
}
case 8:
if let las = dq.last() {
print(las)
} else {
print(-1)
}
default: continue
}
}
'코딩테스트 > 백준' 카테고리의 다른 글
BOJ-11286 절댓값 힙 Swift (0) | 2024.04.04 |
---|---|
BOJ-11279 최대 힙 Swift (0) | 2024.04.04 |
BOJ-24511 queuestack Swift (1) | 2024.04.03 |
BOJ-2346 풍선 터트리기 Swift (0) | 2024.04.03 |
BOJ-2164 카드2 Swift (0) | 2024.04.02 |