2840번: 행운의 바퀴
문제 풀이 아이디어
- 자료구조/알고리즘
: Double-ended Queue
- 풀이법
1. 일단 큐에 N만큼의 "?"를 넣고 시작합니다.
2. 1바퀴 회전 = popRight + pushLeft
3. 돌린 이후 Deque의 맨 처음 (= 화살표 위치)이 "?"이면 알파벳 입력입니다.
4. 다른 알파벳이 나오거나 이미 있는 알파벳이 나오면 !를 출력합니다.
코드
import Foundation
struct Deque {
var enque: [String]
var deque = [String]()
init(n: Int) {
self.enque = Array(repeating: "?", count: n)
}
var now: String {
get {
if !deque.isEmpty {
return deque.last!
} else {
return enque.first!
}
}
set {
if !deque.isEmpty {
deque[deque.count - 1] = newValue
} else {
enque[0] = newValue
}
}
}
mutating func rotate(num: Int) {
for _ in 0..<num {
self.pushLeft(self.popRight())
}
}
mutating private func pushLeft(_ s: String) {
deque.append(s)
}
mutating private func popRight() -> String {
enque = deque.reversed() + enque
deque = []
return enque.popLast()!
}
mutating func printQueue() {
enque = deque.reversed() + enque
deque = []
print(enque.joined(separator: ""))
}
}
extension String {
var checkIndex: Int {
Int(Character(self).asciiValue! - Character("A").asciiValue!)
}
}
let input = readLine()!.split(separator: " ").map { Int(String($0))! }
let N = input[0], K = input[1]
var wheel = Deque(n: N)
var check = Array(repeating: false, count: 26)
for _ in 0..<K {
let spin = readLine()!.split(separator: " ").map { String($0) }
let num = Int(spin[0])!, string = spin[1]
wheel.rotate(num: num)
if wheel.now == "?" && !check[string.checkIndex] {
wheel.now = spin[1]
check[string.checkIndex] = true
} else if wheel.now == spin[1] {
continue
} else {
print("!"); exit(0)
}
}
wheel.printQueue()