[BOJ, Swift] 18258 - 큐 2

2022. 7. 22. 00:05·PS (Problem Solving)
728x90
 

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)

 

728x90
저작자표시 (새창열림)

'PS (Problem Solving)' 카테고리의 다른 글

[BOJ, Python] 10026 - 적록색약 ( with DFS )  (0) 2022.09.08
[BOJ, Swift] 1021 - 회전하는 큐 ( with 덱(Dequeue) )  (0) 2022.08.13
[BOJ, Python] 람다(lambda)를 활용한 리스트 정렬  (0) 2022.07.24
[BOJ, Python] 입출력 정리  (0) 2022.06.22
[BOJ, Swift] 1932 - 정수 삼각형  (1) 2022.05.08
'PS (Problem Solving)' 카테고리의 다른 글
  • [BOJ, Swift] 1021 - 회전하는 큐 ( with 덱(Dequeue) )
  • [BOJ, Python] 람다(lambda)를 활용한 리스트 정렬
  • [BOJ, Python] 입출력 정리
  • [BOJ, Swift] 1932 - 정수 삼각형
100두산
100두산
출발하게 만드는 힘이 동기라면, 계속 나아가게 만드는 힘은 습관이다.
  • 100두산
    정상에서 보자 ✈️
    100두산
  • 전체
    오늘
    어제
    • 분류 전체보기 (126)
      • Life (6)
        • living (1)
      • Research (6)
      • AI (20)
      • Dev (45)
        • iOS (28)
        • Web (4)
        • flutter (9)
        • etc (4)
      • PS (Problem Solving) (23)
      • Computer Science and Engine.. (21)
        • Data Structures and Algorit.. (13)
        • OOP (Object Oriented Progra.. (8)
      • etc (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    PS
    백트래킹
    파이썬
    오블완
    ios
    자료구조
    BOJ
    Python
    c++
    swift
    Challenger
    TIP
    AI
    SKT
    알고리즘
    백준
    D3
    티스토리챌린지
    SKTelecom
    xcode
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
100두산
[BOJ, Swift] 18258 - 큐 2
상단으로

티스토리툴바