티스토리 뷰

PS (Problem Solving)

[BOJ, Swift] 18258 - 큐 2

100두산 2022. 7. 22. 00:05
 

18258번: 큐 2

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 2,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

1. 큐 구현

FIFO(First In First Out) 구조의 Queue는 Swift에서 기본적으로 제공되지 않기에 따로 구현을 해줘야한다.

 

추가)

왼쪽 배열에 추가

 

삭제)

오른쪽 배열에 값이 존재하면, 오른쪽의 마지막 값을 제거오른쪽 배열에 값이 없으면, 왼쪽 배열을 뒤집어(reversed) 오른쪽 배열에 할당 후 왼쪽 배열 삭제

struct Queue {
	
    var left = [Int]()
    var right = [Int]()
    
    // 큐의 사이즈
    var count: Int {
        left.count + right.count
    }
    
    // 둘 다 비어있어야지만 True 출력
    var isEmpty: Bool {
        left.isEmpty && right.isEmpty
    }
    
    // 오른쪽이 비어있으면 왼쪽의 idx 0 을 출력하지만, 아니면 오른쪽의 idx 0 출력
    var first: Int? {
        guard !isEmpty else { return -1 }
        return right.isEmpty ? left.first : right.last
    }
    
    // 왼쪽이 비어있으면 오른쪽의 idx 0 을 출력하지만, 아니면 왼쪽의 idx 0 출력
    var last: Int? {
        guard !isEmpty else { return -1 }
        return left.isEmpty ? right.first : left.last
    }
    
    // 왼쪽 배열에 값 추가
    mutating func enqueue(_ value: Int) {
        left.append(value)
    }
    
    // 비어있으면 -1을 출력
    // 오른쪽 배열이 비어있으면 왼쪽 배열 뒤집어서 오른쪽 배열에 할당
    // 오른쪽 배열의 마지막 값 제거 및 출력
    mutating func dequeue() -> Int? {
        guard !isEmpty else { return -1 }
        
        if right.isEmpty {
            right = left.reversed()
            left.removeAll()
        }
        return right.popLast()
    }
}

2. 빠른 입출력 + ASCII Code 활용

이번 문제의 입력이 2,000,000줄이므로 빠른 입출력을, 문자열보다 접근이 빠른 ASCII Code를 활용.

// 라이노 님의 FileIO 클래스는 생략
let file = FileIO()

// 큐 초기화
var queue = Queue()

// 빠른 출력을 위해 result에 값을 추가하고 한번에 출력
var result = ""

for _ in 0 ..< file.readInt() {
	// 명령어 문자열을 아스키 넘버로 변환하여 받고,
    let inp = file.readString()
    
    // 정수가 필요한 명령에만 다시 입력을 받음
    switch inp {
    // push
    case 448:
        queue.enqueue(file.readInt())
    // pop
    case 335:
        result += queue.isEmpty ? "-1\n" : "\(queue.dequeue()!)\n"
    // size
    case 443:
        result += "\(queue.count)\n"
    // empty
    case 559:
        result += queue.isEmpty ? "1\n" : "0\n"
    // front
    case 553:
        result += queue.isEmpty ? "-1\n" : "\(queue.first!)\n"
    // back
    case 401:
        result += queue.isEmpty ? "-1\n" : "\(queue.last!)\n"
    default:
        break
    }
}

// 한번에 출력
print(result)

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함