[Level 2] 수식 최대화 + Swift

sanghee·2021년 9월 9일
0

🙈코딩테스트

목록 보기
30/52
post-thumbnail

[Level 2] 수식 최대화

https://programmers.co.kr/learn/courses/30/lessons/67257

solution 함수

부호는 총 "+", "-", ""로 세가지이다. 순서는 32*1로 6가지인데, 짧으므로 일일히 orders 배열에 작성한다. expressArr은 express 문자열을 숫자와 부호로 쪼갠다. splitExpression 함수는 밑에 나온다. orders에서 각각 order를 calculate함수를 통해 연산을 한 최종값을 도출한다. 최종값들을 result배열에 넣은 후, 최대값을 구하고 기존 Int타입에서 Int64타입으로 변환한다.

let expression = "100-200*300-500+20"

func solution(_ expression:String) -> Int64 {
    var result: [Int] = []
    let orders = [["+", "-", "*"], ["+", "*", "-"],
                  ["-", "+", "*"], ["-", "*", "+"],
                  ["*", "+", "-"], ["*", "-", "+"]]
    
    // ["100", "-", "200", "*", "300", "-", "500", "+", "20"]
    let expressArr = splitExpression(expression)
    
    for order in orders {
        let num = calculate(expressArr, order)
        result.append(num)
    }
    
    return Int64(result.max()!)
}

splitExpression 함수

splitExpression 함수는 expression을 받아서 쪼갠 배열로 반환하는 함수이다. 재활용하지는 않아서 따로 분리할 필요는 없지만, 가독성을 위해서 분리하였다.

func splitExpression(_ expression: String) -> [String] {
    var result: [String] = []
    var tmp = ""
    
    for v in expression {
        let str = String(v)
        if !["+", "-", "*"].contains(str) {
            tmp += str
        } else {
            result.append(tmp)
            result.append(str)
            tmp = ""
        }
    }
    result.append(tmp)
    
    return result
}

calculate 함수

calculate 함수는 쪼개진 express 배열과 order 순서가 있는 배열을 받아, 연산을 한 값을 반환한다. orderArr가 ["+", "-", "*"]인 경우, order "+"에서부터 출발한다. expressArr을 복사한 arr 배열에서 "+" 연산자가 없을 때까지 while문을 돌려 연산한다. arr에서 두 숫자를 제거하여 firstNum, secondNum을 정의한다. 연산을 한 이후에, 연산자의 자리에 연산한 최종 숫자를 넣는다. 연산이 다 끝나면 숫자 하나가 남으므로, 타입을 Int로 변환한 이후에 부호를 없앤다.

func calculate(_ expressArr: [String], _ orderArr: [String]) -> Int {
    var arr = expressArr
    
    for order in orderArr {
        while arr.contains(order) {
            guard let index = arr.firstIndex(of: order) else { break }
            let firstNum = arr.remove(at: index - 1)
            let secondNum = arr.remove(at: index)
            
            switch order {
            case "+": arr[index - 1] = String("\(Int(firstNum)! + Int(secondNum)!)")
            case "-": arr[index - 1] = String("\(Int(firstNum)! - Int(secondNum)!)")
            case "*": arr[index - 1] = String("\(Int(firstNum)! * Int(secondNum)!)")
            default: break
            }
        }
    }
    
    return abs(Int(arr[0])!)
}
profile
👩‍💻

0개의 댓글