💬 문제
https://school.programmers.co.kr/learn/courses/30/lessons/67257
💬 Idea
- 숫자를 저장하는 numArr와, 연산 기호를 차례대로 저장하는 operArr 배열을 만든다.
- 그리고 순열을 통해 연산 우선순위 조합들을 구해 formulaPermutation 배열에 저장해준다.
- 이후 formulaPermutation을 돌며 calbyFomula 메서드를 호출하여 각 우선순위 수식별 절댓값을 구하고, 이를 maxValue와 비교하여 최댓값을 구해준다.
<calbyFomula 메서드 동작 방식>
- 우선순위를 돌며 [”+”, “-”, “*”] 연산 기호가 차례대로 저장되어있는 operArr에 해당 우선순위가 들어있을 때까지 반복한다.
- operArr에서 해당 연산기호의 첫 인덱스를 찾는다.
- 숫자들이 저장되어있는 numArr의
index, index + 1 2개의 숫자가 해당 연산기호로 연산되어야 할 숫자이므로 해당 두 인덱스에 해당하는 숫자를 연산기호에 맞게 연산해준다. - 연산 결과를 index번째에 저장하고, 뒤에 있던 index + 1번은 배열에서 삭제해준다.
- 연산 기호도 연산이 끝났으므로 삭제해준다.
- 이를 연산 우선순위가 끝날때까지 반복해준다.
💬 풀이
import Foundation
func solution(_ expression:String)->Int64{letnumArr= expression.split(whereSeparator:{ $0 =="+" || $0 =="*" || $0 =="-"}).map({Int($0)! })letoperArr= expression.split(whereSeparator:{ $0.isNumber }).map({String($0)})letformulaPermutation=permutation(Array(Set(operArr)),Set(operArr).count)varmaxValue=0foriin formulaPermutation {
maxValue =max(maxValue,calbyFormula(i, operArr, numArr))}returnInt64(maxValue)}
// 우선순위 수식 기반으로 값을 계산하는 메서드
func calbyFormula(_ priority:[String], _ operArr:[String], _ numArr:[Int])->Int{varnumArr= numArr
varoperArr= operArr
foriin priority {while operArr.contains(String(i)){letidx= operArr.firstIndex(of:String(i))??-1if i =="*"{numArr[idx]=numArr[idx]* numArr[idx +1]}elseif i =="+"{numArr[idx]=numArr[idx]+ numArr[idx +1]}else{numArr[idx]=numArr[idx]- numArr[idx +1]}
numArr.remove(at: idx +1)
operArr.remove(at: idx)}}returnabs(numArr[0])}
// 순열 생성 메서드
func permutation(_ array:[String], _ n:Int)->Set<[String]>{varresult=Set<[String]>()if array.count < n {return result }varvisited=Array(repeating:false, count: array.count)func cycle(_ now:[String]){if now.count == n {
result.insert(now)return}foriin0..<array.count {ifvisited[i]{continue}else{visited[i]=truecycle(now +[array[i]])visited[i]=false}}}cycle([])return result
}
💬 문제https://school.programmers.co.kr/learn/courses/30/lessons/67257
💬 Idea<calbyFomula 메서드 동작 방식>
index,index + 12개의 숫자가 해당 연산기호로 연산되어야 할 숫자이므로 해당 두 인덱스에 해당하는 숫자를 연산기호에 맞게 연산해준다.💬 풀이