λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm🐰/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] Swift μˆ˜μ‹ μ΅œλŒ€ν™”

by Jouureee 2022. 4. 14.

문제 :

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

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - μˆ˜μ‹ μ΅œλŒ€ν™”

IT 벀처 νšŒμ‚¬λ₯Ό μš΄μ˜ν•˜κ³  μžˆλŠ” 라이언은 맀년 사내 해컀톀 λŒ€νšŒλ₯Ό κ°œμ΅œν•˜μ—¬ μš°μŠΉμžμ—κ²Œ μƒκΈˆμ„ μ§€κΈ‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이번 λŒ€νšŒμ—μ„œλŠ” μš°μŠΉμžμ—κ²Œ μ§€κΈ‰λ˜λŠ” μƒκΈˆμ„ 이전 λŒ€νšŒμ™€λŠ” λ‹€λ₯΄κ²Œ λ‹€μŒκ³Ό

programmers.co.kr

λ‚œμ΄λ„ : level2

 

뢄석 :

*, -, + 3개의 μ—°μ‚°μžλ₯Ό 가지고 μˆ˜μ‹μ„ μ΅œλŒ€ν™” ν•˜λŠ” μ—°μ‚°μžμ˜ μš°μ„ μˆœμœ„λ₯Ό μ μš©ν•΄ μ΅œλŒ€κ°’μ„ λ¦¬ν„΄ν•˜λŠ” λ¬Έμ œλ‹€.

λ‚˜λŠ” μˆ˜μ‹μ΄ 3κ°œλ°–μ— μ—†μ–΄μ„œ (3! => 6) κ°€λŠ₯ν•œ 경우의 수λ₯Ό μ†μ½”λ”©ν•˜μ˜€λ‹€.

그리고 μ—°μ‚°μžκ°€ λ“±μž₯ν•˜λŠ” μˆœμ„œλŒ€λ‘œ op배열에 λ‹΄μ•˜κ³  

κ°€λŠ₯ν•œ μš°μ„ μˆœμœ„λ₯Ό λͺ¨λ‘ 계산해 resultλ°°μ—΄μ—μ„œ κ³„μ‚°ν•œ 값은 μ‚­μ œν•˜κ³  κ³„μ‚°ν•˜μ—¬ μ›μ†Œκ°€ ν•œκ°œ λ‚¨μ•˜μ„ 경우 μ΅œλŒ€κ°’μ„ μ—…λ°μ΄νŠΈ ν•΄μ£Όμ—ˆλ‹€.

 

Swift μ½”λ“œ :

//
//  main.swift
//  SOMAπŸ‘©πŸ»‍πŸ’»
//
//  Created by JoSoJeong on 2022/04/14.
//

import Foundation
func calc(_ n1: Int64, _ n2: Int64, _ op: String) -> Int64 {
    switch op {
    case "+":
        return n1 + n2
    case "*":
        return n1 * n2
    case "-":
        return n1 - n2
    default:
        return 0
    }
}

func solution(_ expression:String) -> Int64 {
    let priority: [[String]] = [["*", "+", "-"], ["*", "-", "+"], ["+", "*", "-"], ["+", "-", "*"], ["-", "+", "*"], ["-", "*", "+"]]
    var str = expression
    var arr = str.components(separatedBy: ["-", "*", "+"]).map { Int64(String($0))! }
    var op: [String] = []
    
    //op μˆœμ„œλŒ€λ‘œ 계산
    for i in str {
        if i == "-" {
            op.append("-")
        }else if i == "*" {
            op.append("*")
        }else if i == "+" {
            op.append("+")
        }
    }
    
    var answer:Int64 = 0
    for i in priority {
        var now = i
        var result = arr
        var nowOp = op
        for ii in now {
            while nowOp.contains(ii) {
                if let index = nowOp.firstIndex(of: ii) {
                    result[index] = calc(result[index], result[index+1], ii)
                    result.remove(at: index+1) // κ³„μ‚°ν•œ 숫자 μ§€μš°κΈ°
                    nowOp.remove(at: index)
                }
            }
            
        }
        if result.count != 1 { continue }
        if result.first! < 0 { //μ ˆλŒ€κ°’
            answer = max(answer, -result.first!)
        }else {
            answer = max(answer, result.first!)
        }
        
    }
    return answer
}

 

μ‹€ν–‰ κ²°κ³Ό :

λŒ“κΈ€