프로그래머스- 39

김정현·2023년 5월 31일
0

프로그래머스

목록 보기
39/46

Level 3 정답률 60퍼로 난이도를 많이 높여봤다. 배열 내부 원소들을 다루기가 까다로웠다.
I를 포함하는지 여부는 간단한데, I+" "+숫자에서 숫자만 쏙 빼서 추가하는 함수를 어떻게 구현해야할지를 모르겠다.

우선 배열을 순회하며 공백에 따라 분리한 뒤 인덱스를 조정하는 느낌으로 해봐야할것같다.

import Foundation

func solution(_ operations:[String]) -> [Int] {
    var queue = [Int]()
    for i in operations{
        let operation = i.components(separatedBy: " ")
        let command = operation[0]
        let number = Int(operation[1])!
        
        if command == "I" {
            queue.append(number)
        } else if command == "D 1" {
            queue.sort()
            queue.removeLast()
        } else if command == "D -1" {
            queue.sort()
            queue.removeFirst()
        }
    }
    queue.sort()
    return [queue.last!, queue.first!]
}

오류를 수정해가며 이런 느낌으로 해봤는데 정답이 나오지 않았다. 오류가 나오지않은것은 고무적이다.
문제는 D 1일때도 D와 1을 분리해서 1을 저장해버리는것이 문제일 것이다.

import Foundation

func solution(_ operations:[String]) -> [Int] {
    var queue = [Int]()
    for i in operations{
        let operation = i.components(separatedBy: " ")
        let command = operation[0]
        let number = Int(operation[1])!
        
        if command == "I" {
            queue.append(number)
        } else if command == "D" {
            if number == 1 {
            queue.sort()
            queue.removeLast()
            } else {
                queue.sort()
            queue.removeFirst()
            }
        }
    }
    queue.sort()
    if queue.isEmpty {
        return [0, 0]
    } else{
    return [queue.last!, queue.first!]
    }
}

이렇게 다시 해봤는데 core dumped 오류가 발생했다. 끝끝내 어디서 오류가 발생한지는 찾지 못했고 아마 예상가는 부분은 강제 바인딩 ! 을 많이 사용해서 그 과정에서 오류가 발생 한 것 같다. 답안지를 찾아보았다.

if command == "I" {
            let number = Int(operation[1])!
            queue.append(number)
        } else if command == "D" {
            if let number = Int(operation[1]) {
                if number == 1 {
                    if let maxIndex = queue.indices.max(by: { queue[$0] < queue[$1] }) {
                        queue.remove(at: maxIndex)
                    }
                } else if number == -1 {
                    if let minIndex = queue.indices.min(by: { queue[$0] < queue[$1] }) {
                        queue.remove(at: minIndex)
                    }
                }
            }
        }
    }

구현부에 이런식으로 클로저를 이용하였고, 정렬후 삭제하는 개념이 아니라 실제로 최댓값과 최솟값을 삭제할 수 있었다.

0개의 댓글