https://programmers.co.kr/learn/courses/30/lessons/67257?language=swift 

 

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

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

programmers.co.kr

 

상세하게 구현하는 데에 애를 먹었으나, 

시간을 투자하니 통과라는 결과로 기분을 좋게 해준 고마운 문제.

 

풀이 로직은 이렇다.

1. 일단 expression String을 ["100", "-", "300", "*", "15" ...] 이런식으로 문자열 배열로 만든다.

(아래 코드의 solution함수)

 

2. 총 6가지 경우의 수("-+*", "-*+", "+*-", "+-*", "*-+", "*+-")에 대해 각각

 2-1. 맨 앞의 연산자(ex "-")가 등장하는 경우를 모두 처리.

       처리할 때에는 "-"가 등장한 index - 1을 세 번 지우면 됨.

       (예를 들어 "100", "-", "300"에서 "-"는 1번째 인덱스이니까

        index - 1이 되는 0번째 인덱스를 세 번 지우면 100 - 300 모두 없어짐)

       연산자를 지우면서 연산자 앞 뒤의 숫자를 가지고 연산한 결과를 insert.

  2-2. 맨 앞의 문자열이 더이상 없는 경우 다음 연산자들을 처리.

3. 처리 결과를 반환.

4. solution 함수에서 처리 결과를 반환.

 

정답코드:

import Foundation

func calculate(_ l: String, _ r: String, _ e: String) -> Int64 {
    var result: Int64 = Int64.min
    if e == "-" {
       result = Int64(l)! - Int64(r)! 
    }
    if e == "+" {
       result = Int64(l)! + Int64(r)! 
    }
    if e == "*" {
       result = Int64(l)! * Int64(r)! 
    }
    return result
}

func operate(_ expressionArray: [String]) -> Int64 {
    var mx: Int64 = 0
    let operands:[String] = ["-+*", "-*+", "+*-", "+-*", "*-+", "*+-"] 
    
    for i in 0...5 {
        var tempArray = expressionArray
        var tempOperands = operands[i].map({$0})

        var high: String = "\(tempOperands.first!)"
        var mid: String = "\(tempOperands[1])"
        var low: String = "\(tempOperands.last!)"
        
        var flag = false
        while (flag == false) {
            flag = true
            for (index, element) in tempArray.enumerated() {
                if element == high {
                   let l = tempArray[index - 1]
                   let r = tempArray[index + 1]
                    let calculated = calculate(l, r, element)
                    
                   tempArray.remove(at: index - 1)
                   tempArray.remove(at: index - 1)
                   tempArray.remove(at: index - 1)
                   tempArray.insert("\(calculated)", at: index - 1)
                    flag = false
                    break;
                }
            }
        }
        flag = false
        while (flag == false) {
            flag = true
            for (index, element) in tempArray.enumerated() {
                if element == mid {
                   let l = tempArray[index - 1]
                   let r = tempArray[index + 1]
                    let calculated = calculate(l, r, element)
                    
                   tempArray.remove(at: index - 1)
                   tempArray.remove(at: index - 1)
                   tempArray.remove(at: index - 1)
                   tempArray.insert("\(calculated)", at: index - 1)
                    flag = false
                    break;
                }
            }
        }
        flag = false
        while (flag == false) {
            flag = true
            for (index, element) in tempArray.enumerated() {
                if element == low {
                   let l = tempArray[index - 1]
                   let r = tempArray[index + 1]
                    let calculated = calculate(l, r, element)
                    
                   tempArray.remove(at: index - 1)
                   tempArray.remove(at: index - 1)
                   tempArray.remove(at: index - 1)
                   tempArray.insert("\(calculated)", at: index - 1)
                    flag = false
                    break;
                }
            }
        }
        mx = max(mx,abs(Int64(tempArray.first!)!))
    }
    
    return mx
}

func solution(_ expression:String) -> Int64 {
    
    var expression = expression.map({ $0 })
    var expressionArray = [String]()
    var operands = ["-","+","*"]
    
    var tempString = ""
    for i in 0..<expression.count {
        if operands.contains("\(expression[i])") == true {
            expressionArray.append(tempString)
            expressionArray.append("\(expression[i])")
            tempString = ""
        } else {
            tempString += "\(expression[i])"
        }
    }
    expressionArray.append(tempString)
    
    return operate(expressionArray)
}

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
// custom