내가 푼 풀이
- 이문제는 Swift한테 너무 가혹하다..
- 최대 10만개의 입력값들로 인해 입출력(라이노님)코드를 사용해야하고, 시간복잡도 O(n^2)는 무조건 시간초과가 뜬다.- 문제를 곰곰히 생각해보면 한가지 알수있다.
- 원소를 queuestack에 넣으면 스택형 자료구조는 원소값에 영향을 주지않는다. ( push한 값이 pop되므로)
- 이 말은 queuestack의 스택구조인 원소들은 제외시켜도 결과값에 영향을 주지않는다는 것이다.
- 큐 구조의 원소들만 남겨놓고 이를 붙이면 하나의 큰 큐 배열이 된다.
- 만들어진 큐 배열에 원소를 push / pop 하면 정답값이 나온다.
- 시간초과에 너무 가혹해서 출력도 문자열 출력을 이용했다.
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 Queue<T> {
var elements: [T]
var idx = 0
init(elements: [T]) {
self.elements = elements
}
var isEmpty: Bool {
return elements.isEmpty
}
mutating func push(element: T) {
elements.append(element)
}
mutating func pop() -> T? {
if elements.isEmpty || idx >= elements.count { return nil }
let value = elements[idx]
idx += 1
return value
}
}
// 입력
let fIO = FileIO()
let N = fIO.readInt()
var dataStruct = [Int]()
var elements = [Int]()
var inputElements = [Int]()
var queueIndexArr = [Bool]()
// 스택구조는 패스하고, 큐 구조의 원소만 받는다. 나중에 원소도 넣기위해 인덱스를 저장
for i in 0..<N {
let input = fIO.readInt()
if input == 0 {
dataStruct.append(input)
queueIndexArr.append(true)
} else {
queueIndexArr.append(false)
}
}
// 저장해둔 인덱스에 따라 큐구조의 원소만 넣는다.
for i in 0..<N {
let input = fIO.readInt()
if queueIndexArr[i] {
elements.append(input)
}
}
let M = fIO.readInt()
for i in 0..<M {
inputElements.append(fIO.readInt())
}
// 큐 구조만 가려서 만든 원소들을 하나의 큰 큐 배열로 만든다.
var queue = Queue(elements: elements.reversed())
var answer = ""
// queuestack에 넣을 원소들을 차례로 넣고 결과 출력
if queue.isEmpty {
for i in 0..<inputElements.count {
if i == inputElements.count-1 {
answer += "\(inputElements[i])"
} else {
answer += "\(inputElements[i]) "
}
}
} else {
for i in 0..<inputElements.count {
queue.push(element: inputElements[i])
if i == inputElements.count - 1 {
answer += "\(queue.pop()!)"
} else {
answer += "\(queue.pop()!) "
}
}
}
print(answer)
'코딩테스트 > 백준' 카테고리의 다른 글
BOJ-11279 최대 힙 Swift (0) | 2024.04.04 |
---|---|
BOJ-28279 덱 2 Swift (0) | 2024.04.03 |
BOJ-2346 풍선 터트리기 Swift (0) | 2024.04.03 |
BOJ-2164 카드2 Swift (0) | 2024.04.02 |
BOJ-18258 큐 2 Swift (0) | 2024.04.02 |