[μ€μννΈ μκ³ λ¦¬μ¦] νλ‘κ·Έλλ¨Έμ€: μμμ΅λν
λ¬Έμ
https://programmers.co.kr/learn/courses/30/lessons/67257
μ½λ©ν μ€νΈ μ°μ΅ - μμ μ΅λν
IT λ²€μ² νμ¬λ₯Ό μ΄μνκ³ μλ λΌμ΄μΈμ 맀λ μ¬λ΄ ν΄μ»€ν€ λνλ₯Ό κ°μ΅νμ¬ μ°μΉμμκ² μκΈμ μ§κΈνκ³ μμ΅λλ€. μ΄λ² λνμμλ μ°μΉμμκ² μ§κΈλλ μκΈμ μ΄μ λνμλ λ€λ₯΄κ² λ€μκ³Ό
programmers.co.kr
λ¬Έμ μ€λͺ
IT λ²€μ² νμ¬λ₯Ό μ΄μνκ³ μλ λΌμ΄μΈμ 맀λ μ¬λ΄ ν΄μ»€ν€ λνλ₯Ό κ°μ΅νμ¬ μ°μΉμμκ² μκΈμ μ§κΈνκ³ μμ΅λλ€.
μ΄λ² λνμμλ μ°μΉμμκ² μ§κΈλλ μκΈμ μ΄μ λνμλ λ€λ₯΄κ² λ€μκ³Ό κ°μ λ°©μμΌλ‘ κ²°μ νλ €κ³ ν©λλ€.
ν΄μ»€ν€ λνμ μ°Έκ°νλ λͺ¨λ μ°Έκ°μλ€μκ²λ μ«μλ€κ³Ό 3κ°μ§μ μ°μ°λ¬Έμ(+, -, *) λ§μΌλ‘ μ΄λ£¨μ΄μ§ μ°μ° μμμ΄ μ λ¬λλ©°, μ°Έκ°μμ λ―Έμ
μ μ λ¬λ°μ μμμ ν¬ν¨λ μ°μ°μμ μ°μ μμλ₯Ό μμ λ‘κ² μ¬μ μνμ¬ λ§λ€ μ μλ κ°μ₯ ν° μ«μλ₯Ό μ μΆνλ κ²μ
λλ€.
λ¨, μ°μ°μμ μ°μ μμλ₯Ό μλ‘ μ μν λ, κ°μ μμμ μ°μ°μλ μμ΄μΌ ν©λλ€. μ¦, + > - > * λλ - > * > + λ±κ³Ό κ°μ΄ μ°μ°μ μ°μ μμλ₯Ό μ μν μ μμΌλ +,* > - λλ * > +,-μ²λΌ 2κ° μ΄μμ μ°μ°μκ° λμΌν μμλ₯Ό κ°μ§λλ‘ μ°μ°μ μ°μ μμλ₯Ό μ μν μλ μμ΅λλ€. μμμ ν¬ν¨λ μ°μ°μκ° 2κ°λΌλ©΄ μ μν μ μλ μ°μ°μ μ°μ μμ μ‘°ν©μ 2! = 2κ°μ§μ΄λ©°, μ°μ°μκ° 3κ°λΌλ©΄ 3! = 6κ°μ§ μ‘°ν©μ΄ κ°λ₯ν©λλ€.
λ§μ½ κ³μ°λ κ²°κ³Όκ° μμλΌλ©΄ ν΄λΉ μ«μμ μ λκ°μΌλ‘ λ³ννμ¬ μ μΆνλ©° μ μΆν μ«μκ° κ°μ₯ ν° μ°Έκ°μλ₯Ό μ°μΉμλ‘ μ μ νλ©°, μ°μΉμκ° μ μΆν μ«μλ₯Ό μ°μΉμκΈμΌλ‘ μ§κΈνκ² λ©λλ€.
μλ₯Ό λ€μ΄, μ°Έκ°μ μ€ λ€μ€κ° μλμ κ°μ μμμ μ λ¬λ°μλ€κ³ κ°μ ν©λλ€.
"100-200*300-500+20"
μΌλ°μ μΌλ‘ μν λ° μ μ°νμμ μ½μλ μ°μ°μ μ°μ μμμ λ°λ₯΄λ©΄ λνκΈ°μ λΉΌκΈ°λ μλ‘ λλ±νλ©° κ³±νκΈ°λ λνκΈ°, λΉΌκΈ°μ λΉν΄ μ°μ μμκ° λμ * > +,- λ‘ μ°μ μμκ° μ μλμ΄ μμ΅λλ€.
λν κ·μΉμ λ°λΌ + > - > * λλ - > * > + λ±κ³Ό κ°μ΄ μ°μ°μ μ°μ μμλ₯Ό μ μν μ μμΌλ +,* > - λλ * > +,- μ²λΌ 2κ° μ΄μμ μ°μ°μκ° λμΌν μμλ₯Ό κ°μ§λλ‘ μ°μ°μ μ°μ μμλ₯Ό μ μν μλ μμ΅λλ€.
μμμ μ°μ°μκ° 3κ° μ£Όμ΄μ‘μΌλ―λ‘ κ°λ₯ν μ°μ°μ μ°μ μμ μ‘°ν©μ 3! = 6κ°μ§μ΄λ©°, κ·Έ μ€ + > - > * λ‘ μ°μ°μ μ°μ μμλ₯Ό μ νλ€λ©΄ κ²°κ΄κ°μ 22,000μμ΄ λ©λλ€.
λ°λ©΄μ * > + > - λ‘ μ°μ°μ μ°μ μμλ₯Ό μ νλ€λ©΄ μμμ κ²°κ΄κ°μ -60,420 μ΄μ§λ§, κ·μΉμ λ°λΌ μ°μΉ μ μκΈμ μ λκ°μΈ 60,420μμ΄ λ©λλ€.
μ°Έκ°μμκ² μ£Όμ΄μ§ μ°μ° μμμ΄ λ΄κΈ΄ λ¬Έμμ΄ expressionμ΄ λ§€κ°λ³μλ‘ μ£Όμ΄μ§ λ, μ°μΉ μ λ°μ μ μλ κ°μ₯ ν° μκΈ κΈμ‘μ return νλλ‘ solution ν¨μλ₯Ό μμ±ν΄μ£ΌμΈμ.
[μ νμ¬ν]
- expressionμ κΈΈμ΄κ° 3 μ΄μ 100 μ΄νμΈ λ¬Έμμ΄μ λλ€.
- expressionμ 곡백문μ, κ΄νΈλ¬Έμ μμ΄ μ€λ‘μ§ μ«μμ 3κ°μ§μ μ°μ°μ(+, -, *) λ§μΌλ‘ μ΄λ£¨μ΄μ§ μ¬λ°λ₯Έ μ€μνκΈ°λ²(μ°μ°μ λ λμ μ¬μ΄μ μ°μ°κΈ°νΈλ₯Ό μ¬μ©νλ λ°©μ)μΌλ‘ ννλ μ°μ°μμ
λλ€. μλͺ»λ μ°μ°μμ μ
λ ₯μΌλ‘ μ£Όμ΄μ§μ§ μμ΅λλ€.
- μ¦, "402+-561*"μ²λΌ μλͺ»λ μμμ μ¬λ°λ₯Έ μ€μνκΈ°λ²μ΄ μλλ―λ‘ μ£Όμ΄μ§μ§ μμ΅λλ€.
- expressionμ νΌμ°μ°μ(operand)λ 0 μ΄μ 999 μ΄νμ μ«μμ
λλ€.
- μ¦, "100-2145*458+12"μ²λΌ 999λ₯Ό μ΄κ³Όνλ νΌμ°μ°μκ° ν¬ν¨λ μμμ μ λ ₯μΌλ‘ μ£Όμ΄μ§μ§ μμ΅λλ€.
- "-56+100"μ²λΌ νΌμ°μ°μκ° μμμΈ μμλ μ λ ₯μΌλ‘ μ£Όμ΄μ§μ§ μμ΅λλ€.
- expressionμ μ μ΄λ 1κ° μ΄μμ μ°μ°μλ₯Ό ν¬ν¨νκ³ μμ΅λλ€.
- μ°μ°μ μ°μ μμλ₯Ό μ΄λ»κ² μ μ©νλλΌλ, expressionμ μ€κ° κ³μ°κ°κ³Ό μ΅μ’ κ²°κ΄κ°μ μ λκ°μ΄ 263 - 1 μ΄νκ° λλλ‘ μ λ ₯μ΄ μ£Όμ΄μ§λλ€.
- κ°μ μ°μ°μλΌλ¦¬λ μμ μλ κ²μ μ°μ μμκ° λ λμ΅λλ€.
νμ΄
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μ λ κ°μ μλ¬Έμ λ₯Ό μ μν΄μΌν©λλ€.
1. μ°μ°μ μ°μ μμμ μ‘°ν©μ λ§λλ λ¬Έμ
2. μ°μ°μ μ°μ μμλλ‘ μμ κ³μ°νλ λ¬Έμ
λ°λΌμ μ‘°ν©κ³Ό μμ νμμΌλ‘ ν μ μλ λ¬Έμ μμ΅λλ€.
μ‘°ν© μ°ΎκΈ°
λ¨Όμ , μ°μ°μμ μ°μ μμλ λ°±νΈλνΉμ ν΅ν΄ μ‘°ν©μ μμ±ν΄μ£Όμμ΅λλ€. "+", "-", "*" λ‘ λ§λ€ μ μλ μ€λ³΅μλ μ‘°ν©μ λ§λ€λ©΄ μ΄ 6κ°μ μ‘°ν©μ μ»κ² λ©λλ€.
func makeComb (operators: [String], priorityOp: [String], combinations: [[String]]) -> [[String]] {
var combinations = combinations
var priorityOp = priorityOp
if priorityOp.count == operators.count {
combinations.append(priorityOp)
return combinations
}
for i in 0..<operators.count {
if priorityOp.contains(operators[i]) { continue }
priorityOp.append(operators[i])
combinations = makeComb(operators: operators, priorityOp: priorityOp, combinations: combinations)
priorityOp.removeLast()
}
return combinations
}
μ°μ μμλλ‘ κ³μ°νκΈ°
μμ λ°°μ΄λ‘ λλκΈ°
μ°μ μμλλ‘ κ³μ°μ νκΈ° μν΄μ λ¬Έμμ΄μμ μ°μ°μμ νΌμ°μ°μλ₯Ό κ°κ° λλμ΄μ€ νμκ° μμμ΅λλ€. μ΄λ₯Ό μν΄ expression λ¬Έμμ΄μ λΆλΆ λ¬Έμμ΄λ‘ λλ μ λ°°μ΄μ μ μ₯νλ ν¨μλ₯Ό λ§λ€κΈ°λ‘ νκ³ λ€μκ³Ό κ°μ μκ³ λ¦¬μ¦μΌλ‘ ν¨μλ₯Ό ꡬμ±νμμ΅λλ€.
- expression λ¬Έμμ΄μ "+", "-", "*" λ¬Έμλ₯Ό κΈ°μ€μΌλ‘ λλ μ λ°°μ΄λ‘ λ§λ λ€. μ) "100*10-2+1" -> ["100", "10", "2", "1"]
- expression λ¬Έμμ΄μμ μ°μ°μ λ¬Έμλ€μ μμλ₯Ό ꡬνλ€. μ) ["*", "-", "+"]
- μ«μλ§ μλ λ°°μ΄μ μ°μ°λ€μ λΌμλ£λλ€. μ) ["100", "*", "10", "-", "2", "+", "1"]
μ΄λ κ² νλ©΄ μ 체 μμ μ°μ°μμ νΌμ°μ°μλ‘ λλ μ λ°°μ΄μ λ΄κ² λ©λλ€. μ μκ³ λ¦¬μ¦μ ꡬννλ©΄ λ€μκ³Ό κ°μ΄ ꡬνν μ μμ΅λλ€.
func separateExpression(expression: String) -> [String] {
var operators = expression.filter({ ["+", "-", "*"].contains($0) }).map({ symbol in String(symbol) })
var numbers = expression.components(separatedBy: ["+", "-", "*"])
var i = 1
while !operators.isEmpty {
numbers.insert(operators.removeFirst(), at: i)
i += 2
}
return numbers
}
μ°μ°μ λ¬Έμλ₯Ό μ€μ μ°μ°μλ‘ λ°κΎΈκΈ°
μ€μννΈμμ μ°μ¬μλ€μ ν¨μμ΄κ³ ν¨μλ λ°νκ°μΌλ‘ μ¬μ©λ μ μκΈ°λλ¬Έμ, κ° λ¬Έμμ λν μ°μ°μλ₯Ό λ°ννλ ν¨μλ₯Ό ꡬμ±ν μ μμ΅λλ€.
func stringToOperator(op: String) -> ((Int, Int)->Int) {
switch op {
case "+":
return (+)
case "-":
return (-)
default:
return (*)
}
}
μ€νμΌλ‘ μ°μ μμμ λ§κ² κ³μ°νκΈ°
μ΄μ 1λ¨κ³μμ ꡬν μ‘°ν©κ³Ό λ§λ€μ΄μ§ μ λ°°μ΄μ μ΄μ©ν΄μ μ°μ μμλλ‘ κ³μ°μ μνν΄μ£Όμ΄μΌ ν©λλ€. μ€νμ μ¬μ©ν΄μ νμ¬ μ°μ μμκ° κ°μ₯ λμ μ°μ°μλΆν° μ¬μ©νλ©΄ μμ κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€. μκ³ λ¦¬μ¦μ λ€μκ³Ό κ°μ΅λλ€.
- λΉ μ€νμ λ§λ λ€.
- μ°μ°μ μ°μ μμ λ°°μ΄μ μ°Έμ‘°ν΄μ νμ¬ μ°μ μμκ° κ°μ₯ λμ μ°μ°μλ₯Ό μ€μ νλ€.
- νμ¬ μμμ κ°μ₯ μ λ¬Έμλ₯Ό popνλ€.
- κΊΌλΈ λ¬Έμκ° μ«μλΌλ©΄ μ€νμ λ£λλ€.
- μ€νμ κ°μ΄ λ€μ΄μκ³ , κΊΌλΈ λ¬Έμκ° μ°μ°μμΌ λ,
- νμ¬ μ°μ μμκ° κ°μ₯ λμ μ°μ°μμ μΌμΉνλ€λ©΄ :
- μ€νμ λ§μ§λ§ popν΄μ lhsλ‘ λ§λ λ€.
- μμμ λ¬Έμ νλλ₯Ό λ pop ν΄μ rhsλ‘ λ§λ λ€. μλͺ»λ μ°μ°μμ μ£Όμ΄μ§μ§ μκΈ° λλ¬Έμ νμ μ«μκ° λμ΅λλ€.
- lhsμ rhsμ λν΄ κΊΌλΈ μ°μ°μλ‘ μ°μ°μ μνν΄μ μ°μ° κ²°κ³Όλ₯Ό λ€μ μ€νμ λ£λλ€.
- νμ¬ μ°μ μμκ° κ°μ₯ λμ μ°μ°μκ° μλλΌλ©΄
- μ€νμ κ·Έλλ‘ λ£λλ€.
- νμ¬ μ°μ μμκ° κ°μ₯ λμ μ°μ°μμ μΌμΉνλ€λ©΄ :
- μ€νμ μ μ₯λ κ°μ μ°μ μμκ° κ°μ₯ λμ μ°μ°μλ₯Ό κ³μ°ν μμ΄κΈ° λλ¬Έμ μ€νμ μλ μμ νμ¬ μμΌλ‘ μΉννλ€.
- κ°μ§κ³ μλ μ°μ°μλ₯Ό μ°μ μμλλ‘ λ€ μ¬μ©ν λκΉμ§ 1 ~ 6λ² κ³Όμ μ λ°λ³΅νλ€.
μ μμ μ ꡬν λͺ¨λ μ°μ°μ μ‘°ν©μ λν΄μ μννκ³ , κ° μ‘°ν©μ μ°μ°μ΄ λλ λλ§λ€ μ λκ°μΌλ‘ μ΅λκ°μ μ λ°μ΄νΈνλ©΄ λ΅μ μ°Ύμ μ μμ΅λλ€.
for combination in operatorCombinations {
var currentExpression = separatedExpression
var result = 0
for op in combination {
var stack: [String] = []
while !currentExpression.isEmpty {
var next = currentExpression.removeFirst()
if !stack.isEmpty && op == next {
let lhs = Int(stack.removeLast())!
let rhs = Int(currentExpression.removeFirst())!
next = String(stringToOperator(op: op)(lhs, rhs))
}
stack.append(next)
}
currentExpression = stack
result = Int(currentExpression.last!)!
}
answer = max(answer, abs(result))
}
μ½λ