이중 우선순위 큐는 두 가지 연산을 지원하는 자료구조입니다:
| 명령어 | 수신 탑(높이) |
|---|---|
| I 숫자 | 큐에 숫자를 삽입합니다. |
| D 1 | 큐에서 최댓값을 삭제합니다. |
| D -1 | 큐에서 최솟값을 삭제합니다. |
이중 우선순위 큐가 할 연산 operations가 매개변수로 주어질 때, 모든 연산을 처리한 후 큐가 비어있으면 [0, 0], 큐가 비어있지 않으면 [최댓값, 최솟값]을 반환하는 solution 함수를 구현하세요.
operations는 길이가 1 이상 1,000,000 이하인 문자열 배열입니다.operations의 원소는 큐가 수행할 연산을 나타냅니다.| operations | return |
|---|---|
| ["I 16", "I -5643", "D -1", "D 1", "D 1", "I 123", "D -1"] | [0, 0] |
| ["I -45", "I 653", "D 1", "I -642", "I 45", "I 97", "D 1", "D -1", "I 333"] | [333, -45] |
queue.sort()를 사용하여 최댓값과 최솟값을 처리하는 방법으로 접근하였다. 큐에 삽입된 값에 대해 오름차순 또는 내림차순으로 정렬하고, 가장 큰 값 또는 가장 작은 값을 삭제하는 방식이다.
import Foundation
func solution(_ operations:[String]) -> [Int] {
var queue: [Int] = []
for operation in operations {
let splitOperation = operation.split(separator: " ").map { String($0) }
let (command, value) = (splitOperation[0], Int(splitOperation[1])!)
if command == "I" {
queue.append(value)
} else if command == "D" && !queue.isEmpty {
if value == 1 {
queue.sort(by: <)
queue.removeLast()
} else if value == -1 {
queue.sort(by: >)
queue.removeLast()
}
}
}
return queue.isEmpty ? [0, 0] : [queue.max()!, queue.min()!]
}
입력 파싱:
각 연산을 공백을 기준으로 나누어 command와 value로 분리합니다. command는 연산 종류("I" 또는 "D"), value는 해당 연산에서 사용할 숫자입니다.
연산 처리:
결과 반환:
큐가 비어있으면 [0, 0]을 반환하고, 그렇지 않으면 큐의 최댓값과 최솟값을 반환합니다. queue.max()와 queue.min()을 사용하여 각각 최댓값과 최솟값을 찾습니다.