본문 바로가기
Xcode/Swift - Algorithm

Swift ) 프로그래머스(Lv3) - 이중우선순위큐 (Heap)

by 후르륵짭짭 2020. 10. 4.
728x90
반응형

programmers.co.kr/learn/courses/30/lessons/42628

 

코딩테스트 연습 - 이중우선순위큐

 

programmers.co.kr

안녕하세요 후르륵짭짭 입니다.

오랜만에 알고리즘 문제를 들고 온 것 같습니다.

어렵지 않는데, 그냥 글을 올립니다 ㅎㅎㅎ 

** 문제 해결 **

hururuek-chapchap.tistory.com/116

 

Swift ) 프로그래머스(Lv3) - 디스크 컨트롤러 (PriorityQueue)

programmers.co.kr/learn/courses/30/lessons/42627 코딩테스트 연습 - 디스크 컨트롤러 하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. �

hururuek-chapchap.tistory.com

예전에 우선순위 큐를 구현 하는 방법에 대해서 설명 했습니다.

그러면 정말 간단하게 아래 코드 처럼 적어주면 끝~!

func solution(_ operations:[String]) -> [Int] {
    
    var maxHeap : [Int] = []
    
    for element in operations{
        
        let split = element.components(separatedBy: " ")
        let commend = split[0]
        let number = split[1]
        
        if commend == "I"{
            
            makeMAXHeap(&maxHeap, Int(number)!)
        }
        else {
            
            if maxHeap.isEmpty {continue}
            
            if number == "1"{
                    
                maxHeap.removeLast()
                
            }
            else{
                
                maxHeap.removeFirst()
                
            }
            
        }
        
    }
    
    print(maxHeap)
    
    return maxHeap.isEmpty ? [0,0] : [maxHeap.max()! , maxHeap.min()!]
}

func makeMAXHeap (_ maxHeap : inout [Int] ,_ number : Int){
    
    var start = 0
    var end = maxHeap.count - 1
    
    if maxHeap.isEmpty {
        maxHeap.append(number)
        return
    }
    
    while start <= end {
        
        let mid = (start + end) / 2
        
        if maxHeap[mid] < number {
            start = mid + 1
        }
        else{
            end = mid - 1
        }
    }
    
    maxHeap.insert(number, at: start)
    
}

 

어차피 배열로 정렬이 되기 때문에 , 큰 문제 없이 최소값은 removeFirst 해주고 최대 값은 removeLast 해주면 

됩니다.

간단하죠??

 

728x90
반응형

댓글