https://programmers.co.kr/learn/courses/30/lessons/67257?language=swift
상세하게 구현하는 데에 애를 먹었으나,
시간을 투자하니 통과라는 결과로 기분을 좋게 해준 고마운 문제.
풀이 로직은 이렇다.
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)
}
'Algorithm' 카테고리의 다른 글
프로그래머스 - 괄호 변환 Swift (0) | 2021.09.07 |
---|---|
프로그래머스 - 프린터 Swift (0) | 2021.09.07 |
프로그래머스 - 5주차[Swift] (0) | 2021.09.06 |
프로그래머스 크레인 인형뽑기 게임 [Swift] (0) | 2021.09.03 |
프로그래머스 - 정수 제곱근 판별 [Swift] (0) | 2021.07.05 |
최근댓글