본문 바로가기
알고리즘

[Swift] 프로그래머스 - 카카오 수식 최대화

by 고고 2022. 2. 11.

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

 

코딩테스트 연습 - 수식 최대화

IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과

programmers.co.kr

 

 

1. +, -, *로 우선순위 순열을 만들어줍니다.

2. 사전작업으로 숫자들만 있는 배열과 연산자들만 있는 배열을 만들어줍니다.

3. 우선순위를 전부 다 돌며 값을 계산합니다.

4. 그렇게 해서 나온 값을 절댓값으로 만들고 result와 max연산을 해주면 됩니다.

import Foundation

func permute(_ nums: [String], _ targetNum: Int) -> [[String]] {
    var result = [[String]]()
    var visited = [Bool](repeating: false, count: nums.count)
    
    func permutation(_ nowPermute: [String]) {
        if nowPermute.count == targetNum {
            result.append(nowPermute)
            return
        }
        for i in 0..<nums.count {
            if visited[i] == true {
                continue
            }
            else {
                visited[i] = true
                permutation(nowPermute + [nums[i]])
                visited[i] = false
            }
        }
    }
    permutation([])
    
    return result
}

func solution(_ expression:String) -> Int64 {
    let priorities = permute(["+", "-", "*"], 3) // 우선순위
    let array = Array(expression)
    var result = 0
    
    var temp = ""
    var ints = [Int]()
    var operators = [String]()
    
    for i in 0..<expression.count {
        let str = String(array[i])
        if Int(str) == nil {
            ints.append(Int(temp)!)
            temp = ""
            operators.append(str)
        } else {
            temp.append(str)
        }
        
        if i == expression.count - 1 {
            ints.append(Int(temp)!)
            temp = ""
        }
    }
    
    for priority in priorities {
        var ints = ints
        var operators = operators
        
        for pr in priority {
            var op = 0
            
            while op < operators.count {
                if pr == operators[op] {
                    let first = ints[op]
                    let second = ints[op + 1]
                    
                    ints.remove(at: op)
                    
//                    print(first, second, ints, operators)
                    
                    if pr == "+" {
                        ints[op] = first + second
                    } else if pr == "*" {
                        ints[op] = first * second
                    } else if pr == "-" {
                        ints[op] = first - second
                    }
                    
                    operators.remove(at: op)
                } else {
                    op += 1
                }
            }
        }
        
        result = max(result, abs(ints.first!))
    }
    
    return Int64(result)
}

solution("100-200*300-500+20") // 60420
solution("50*6-3*2") // 300

댓글