๋ฌธ์ ์ค๋ช
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 ์ดํ๊ฐ ๋๋๋ก ์ ๋ ฅ์ด ์ฃผ์ด์ง๋๋ค.
- ๊ฐ์ ์ฐ์ฐ์๋ผ๋ฆฌ๋ ์์ ์๋ ๊ฒ์ ์ฐ์ ์์๊ฐ ๋ ๋์ต๋๋ค.
์ ์ถ๋ ฅ ์
expression | result |
"50*6-3*2" | 300 |
"100-200*300-500+20" | 60420 |
Foma์ ํ์ด
1. ์ฐ์ฐ์์ ๊ฐฏ์๋ฅผ ์์๋ด์ด ์ฐ์ ์์์กฐํฉ์ ๋ง๋ค์ด๋ผ์ ์๋๋
2 .์์ ํฌํจ๋ ์ซ์์ ์ฐ์ฐ์๋ฅผ ๊ฐ๊ฐ ๋ถ๋ฆฌํด๋ผ ์ ์๋๋
3. ์ฐ์ ์์์กฐํฉ๋๋ก ๊ฐ ์์ ์ฐ์ฐ์์ ์์น๋ฅผ ์์๋ด์ด ์์น์ ๋ง๋ ์ซ์๋ค์ ์ฐ์ฐํ๊ณ ์์ ์ฌ์ ๋ฆฝํ ์ ์๋๊ฐ
4. ์ฐ์ ์์์กฐํฉ๋๋ก ์ฐ์ฐํ ์์ ์ ๋๊ฐ ์ค ๊ฐ์ฅ ์ต๋๊ฐ์ ๋ฐํํ ์ ์๋๊ฐ
์ ๊ฐ ์๊ฐํ ํต์ฌ์ ์ด๋ ๊ฒ 4๊ฐ์ง์ ๋๋ค.
์์ธํ ํ์ด๋ ์๋์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
expression์์ ๊ฐ ์ฐ์ฐ์์ ์์น๋ฅผ ๋ด์์ค ๋ฐฐ์ด๋ค์ ๋ง๋ค์ด์ค๋ค. => var minus = [Int]() var multiple = [Int]() var plus = [Int]()
๋ฐ๋ ์์ ๋ด์ ๋ฐฐ์ด์ ๋ง๋ค์ด์ค๋ค. => var numbers = [String]()
while๋ฌธ์ ํ์ํ ์ซ์๋ฅผ ์ ์ฅํ ๋ณ์๋ฅผ ๋ง๋ค์ด์ค๋ค. => var j = Int()
(๋ค๋ฅธ ํจ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ์์ ๋ณ์๋ค์ solutionํจ์ ๋ฐ์๋ค๊ฐ ๋ง๋ค์ด์ค๋ค.)
๊ทธ๋ฆฌ๊ณ ์ฐ์ฐ์์ ์ฐ์ ์์ ์กฐํฉ๋ค์ ๋ด์ 2์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค์ด์ค๋ค. => var order = [[String]]()
์ฐ์ ์์์กฐํฉ๋๋ก ์ฐ์ฐํ์ ๋์ ๊ฐ๋ค์ ์ ์ฅํ ๋ฐฐ์ด์ ๋ง๋ค์ด์ค๋ค. = > var sums = [Int64]()
์ฐ์ฐ์ ๋ฐฐ์ด์ ๋ฃ์ ์งํฉ์ ๋ง๋ค์ด์ค๋ค.(์งํฉ์ผ๋ก ๋ง๋๋ ์ด์ ๋ ์ค๋ณต์ ์์ ์ฃผ์ด์ง ์ฐ์ฐ์์ ๊ฐฏ์๋ฅผ ์์๋ด์ผ๋๊ธฐ ๋๋ฌธ์ด๋ค.) => var oper = Set<String>()
exprssion์ ํํฐ๋ก ์ฐ์ฐ์์ผ๋๋ก ๊ฑธ๋ฌ์ฃผ๊ณ ๋งต์ผ๋ก ๋ฐฐ์ด๋ก ๋ง๋ค์ด์ค ํฌํจ๋์ด ์๋ ์ฐ์ฐ์๋ค์ ๋ด์์ค๋ค.
=> var operArray = expression.filter({$0 == "+" || $0 == "-" || $0 == "*"}).map{String($0)} ex) "50+3-10*6+9"์ด๋ผ๋ฉด opreArray๋ ["+",-","*","+"]
formUnion์ ์ฌ์ฉํด ์งํฉ์ ์์ ์ฐ์ฐ์๋ค์ ๋ด์ ๋ฐฐ์ด์ ๋ฃ์ด์ค ์ค๋ณต์ ์์ ์ค๋ค.
=> oper.formUnion(operArray)
์ฐ์ ์์์กฐํฉ์ ๋ง๋ค๊ธฐ์ํด์ ์งํฉ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด์ผํ๋ฏ๋ก ์งํฉ์ ๋ฐฐ์ด๋ก ๋ฐ๊ฟ์ค๋ค.(์งํฉ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด๋ ๋์ง๋ง ๋ฐฐ์ด์ด ํธํด์ ๋ฐฐ์ด๋ก ๋ฐ๊ฟ์ค) => let operSetArray = Array(oper)
์ฐ์ฐ์ ๊ฐ์๊ฐ 1๊ฐ์์ ์ต๋ 3๊ฐ์ด๋ฏ๋ก ๊ฐ๊ฐ์ ๊ฒฝ์ฐ์ ์๋ 1!,2!,3!์ด๋ฏ๋ก ์ผ๋ง๋์ง ์์์ ์ง์ order์ ์กฐํฉ์ ๋ง๋ค์ด์ ๋ฃ์ด์คฌ์ต๋๋ค.
=> if oper.count == 1 {
order.append([operSetArray[0]]) => ex) ["+"] or ["-"] or ["*"]
} else if oper.count == 2 {
๋ง์ฝ +,-์ผ๊ฒฝ์ฐ
order = [[operSetArray[0],operSetArray[1]],[operSetArray[1],operSetArray[0]]] => ex) ["+","-"],["-",+"]
}else{
order = [[operSetArray[0],operSetArray[1],operSetArray[2]],[operSetArray[0],operSetArray[2],operSetArray[1]],[operSetArray[1],operSetArray[0],operSetArray[2]],[operSetArray[1],operSetArray[2],operSetArray[0]],[operSetArray[2],operSetArray[1],operSetArray[0]],[operSetArray[2],operSetArray[0],operSetArray[1]]]
=> ex) ["+","-","*"],["+","*","-"].....
}
๊ทธ ๋ค์์ผ๋ก for๋ฌธ์ ์ฌ์ฉํ์ฌ order์ ์๋ ์กฐํฉ๋ค์ ์ฐจ๋ก๋ก ๋๋ ค์ค๋๋ค.
=> for c in order {...}
expression์ ์ฐ์ฐ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌํด์ ์ซ์๋ค๋ง ๋ฐ๋ก numbers์ ๋ด์์ค๋๋ค.
=> numbers = expression.components(separatedBy: CharacterSet(charactersIn: "*-+")) ex)"50+3-10" ์ด๋ผ๋ฉด number = ["50"],["3"],["10"]
expression์์ ์ฐ์ฐ์๋ค๋ง ๋ชจ์ ๋ฐฐ์ด๊ฐ์ ๋ฃ์ด์ค๋๋ค.. (๋ค์ operArray๊ฐ ์ญ์ ๋๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ๋ค์ ๊ฐ์ ๋ฃ์ด์ค์ผํฉ๋๋ค..)
operArray = expression.filter({$0 == "+" || $0 == "-" || $0 == "*"}).map{String($0)}
while๋ฌธ์ ๋ง๋ค์ด์ numbers์ ์ซ์ ๋ฐฐ์ด๊ณผ expression์ ์ฐ์ฐ์ ๋ฐฐ์ด์ ์ฐจ๋ก๋ก ์์ด ์ค์ ์์์ ์ซ์์ ์ฐ์ฐ์๋ฅผ ๋ถ๋ฆฌํ ๋ฐฐ์ด์ ๋ง๋ค์ด์ค๋๋ค. (for๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ๋ง๋ค์์ ๋ง์ฝ "50+3"์ด๋ผ๋ฉด ์ซ์ 50์ ๊ตฌ๋ถํ๊ธฐ ํ๋ค์ด์ ์ด๋ ๊ฒ ์์ด์ ๋ง๋ค์ด์ฃผ์์ต๋๋ค.)
ex) 50 + 3 - 6 + 8 * 7์ด๋ผ๋ฉด numbers๋ ["50", "+" ."3", "-", "6", "+", "8","*",'7"]
var x = 1
while x < numbers.count{
numbers.insert(operArray.first!, at: x)
๊ทธ๋ฆฌ๊ณค minus,plus,multiple์ ๊ฐ๊ฐ ํด๋น ์ธ๋ฑ์ค๋ฅผ ๋ฃ์ด์ค๋๋ค. ex) numbers๊ฐ ["50", "+" ."3", "-", "6", "+", "8","*",'7"] ์ด๋ผ๋ฉด plus = [1,5] minus = [3] mutiple = [7]
if operArray.first! == "-"{
minus.append(x)
}else if operArray.first! == "+"{
plus.append(x)
}else {
multiple.append(x)
}
operArray.removeFirst()
x += 2
}
while๋ฌธ์ ์ฌ์ฉํ์ฌ detectMMP๋ผ๋ ์ฐ์ฐ์๋ฅผ ๊ตฌ๋ถํ๋ ํจ์๋ฅผ ์คํ์์ผ์ค๋๋ค.
์์ํ ๋ ๋ง๋ค์ด๋์ j๋ฅผ 0์ผ๋ก ๋ง๋ค์ด์ค๋๋ค => j = 0
while j < c.count {
detectMMP(c.map({$0})[j]) c๋ order์์ ๊ฐ mapํํด์ฃผ๊ณ ์ฐจ๋ก๋ก ๊บผ๋ด์ค๋๋ค. ex)"+","-","*"
}
๊ทธ๋ฆฌ๊ณค detectMMP๋ฅผ ์ดํด๋ณด๋ฉด ์ธ์๊ฐ์ผ๋ก order์ ์ฐ์ฐ์๋ฅผ ์ฐจ๋ก๋ก ๋ฐ๊ฒ๋ฉ๋๋ค.
func detectMMP(_ oper:String){
plus,minus,multiple๋ฐฐ์ด์ ๊ฐ์ ์ ์ฅํ ๋ณ์๋ฅผ ๋ง๋ค์ด์ค => var mmpCopy = [Int]()
๊ทธ๋ฆฌ๊ณ ์ฐจ๋ก๋ก "+","-","*"์ผ ๊ฒฝ์ฐ์ numbers์ ๊ฐ ๋ฐฐ์ด์ ํด๋น์ธ๋ฑ์ค ์๋ฆฌ์ - 1๊ฐ๊ณผ ํด๋น์ธ๋ฑ์ค์ +1 ๊ฐ์ ์ฐ์ฐ์์ ๋ง๊ฒ ์ฐ์ฐํด์ค๋๋ค.
numbers๊ฐ ["50", "+" ."3", "-", "6", "+", "8","*",'7"] ์ด๊ณ "+"์ผ ๊ฒฝ์ฐ์ plus๋ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค๊ฐ 1์ด๋ฏ๋ก numbers์ -1์๋ฆฌ๋ 0์ด๊ณ +1 ์๋ฆฌ๋ 2์ด๋ฏ๋ก ๊ฐ๊ฐ 50 + 3์ด๋๊ณ numbers[0]์ ๊ฐ์ 53์ผ๋ก ๋ณํ๊ณ ์ ์ฒด๋ ["53", "+" ."3", "-", "6", "+", "8","*",'7"]์ด ๋ฉ๋๋ค.
=> if oper == "+" {
mmpCopy = plus
numbers[plus.first! - 1] = "\(Int(numbers[plus.first! - 1])! + Int(numbers[plus.first! + 1])!)"
๊ทธ๋ฆฌ๊ณ plus์ ์ฒซ๋ฒ์งธ ๊ฐ์ ์ญ์ ํด์ฃผ๊ณ
=> plus.removeFirst()
๋ง์ฝ plus๊ฐ ํ ๊ฐ๊ฐ ์๋์์ j๊ฐ์ ๋ํด์ฃผ์ง์์ ๋ค์ while๋ฌธ์์ "+"๊ฐ ์ค๋๋กํฉ๋๋ค.
if plus.isEmpty {
j += 1
}
๊ทธ๋ฆฌ๊ณ numbers์์ ํด๋น ์ธ๋ฑ์ค์ ์ฐ์ฐ์์ ๋ค์ ๋ํด์ค ๊ฐ์ ์ญ์ ์์ผ์ค๋๋ค.
ex) ["53", "+" ."3", "-", "6", "+", "8","*",'7"] -> ["53", "-", "6", "+", "8","*",'7"]
numbers.remove(at: mmpCopy.first!)
numbers.remove(at: mmpCopy.first!)
๊ทธ๋ฆฌ๊ณ numbers์์ ์ฐ์ฐ์์ ๋ํด์ค ๊ฐ์ด ์ด 2๊ฐ๊ฐ ์์ด์ง๋ฏ๋ก ๊ทธ ๋ค์ ์๋ค์ ์ธ๋ฑ์ค๋ฅผ -2๋ฅผ ํด์ค๋๋ค.
ex) numbers = ["53", "+" ."3", "-", "6", "+", "8","*",'7"] ๋ผ๋ฉด ๋ค์ "+'์ "3"์ด ์์ด์ง๋ฏ๋ก ["53", "-", "6", "+", "8","*",'7"]
minus = [3]์์ -> miuns [1]์ผ๋ก mutiple = [7]์์ multiple [5]๋ก ๋ฐ๋๊ฒ ๋ฉ๋๋ค.
plus = plus.filter{$0 <= mmpCopy.first!}.map{$0} + plus.filter{$0 > mmpCopy.first!}.map{$0-2}
๊ทธ ๋ค์ ๋ค์ solution์ผ๋ก ๋์๊ฐ์ numbers์ ํ๋๋จ์ ๊ฐ์ ์ ๋๊ฐ์ผ๋ก ๋ณํ์ sums์ ๋ฃ์ด์ค๋๋ค.(์ ๋๊ฐ์ผ๋ก ๋ณํํ๊ธฐ ์ํด์ Int64ํ์ผ๋ก ๋ฐ๊ฟ์ค์ผํจ) => sums.append(abs(Int64(numbers.first!)!))
๋ง์ง๋ง์ผ๋ก ์ด๋ ๊ฒ ์ถ๊ฐ๋ sums์์ ๊ฐ์ฅ ํฐ ๊ฐ์ ๋ฐํํด์ค๋๋ค. => return sums.max()!
์ ์ฒด์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
import Foundation
//- ์ฐ์ฐ์์ index๋ฅผ ๋ด์ ๋ฐฐ์ด
var minus = [Int]()
//* ์ฐ์ฐ์์ index๋ฅผ ๋ด์ ๋ฐฐ์ด
var multiple = [Int]()
//+ ์ฐ์ฐ์์ index๋ฅผ ๋ด์ ๋ฐฐ์ด
var plus = [Int]()
//์์ ๋ด์ ๋ฐฐ์ด
var numbers = [String]()
//while๋ฌธ์ ํ์ํ ์ซ์
var j = Int()
func solution(_ expression:String) -> Int64 {
//์ฐ์ฐ์ ์ฐ์ ์์ ์กฐํฉ๋ค์ ๋ด์ 2์ฐจ์๋ฐฐ์ด
var order = [[String]]()
//๊ฐ ์ฐ์ ์์ ์ฐ์ฐํ์๋ ๋ฃ์ด์ค ๊ฐ
var sums = [Int64]()
//์ฐ์ฐ์ ๋ฐฐ์ด์ ๋ฃ์ ์งํฉ
var oper = Set<String>()
//exprssion์ ํฌํจ๋์ด ์๋ ์ฐ์ฐ์ ๋ฐฐ์ด
var operArray = expression.filter({$0 == "+" || $0 == "-" || $0 == "*"}).map{String($0)}
//Set oper์ mmp๋ฅผ ๋ฃ์ด์ค์ ์ค๋ณต์ ์์ค๋ค
oper.formUnion(operArray)
//์ฐ์ ์์์กฐํฉ์ ๋ง๋ค๊ธฐ ์ํด Set๋ฅผ ๋ฐฐ์ด๋ก ๋ง๋ค์ด์ค
let operSetArray = Array(oper)
//์ฐ์ฐ์ ๊ฐฏ์๋งํผ ์ฐ์ ์์ ์กฐํฉ
if oper.count == 1 {
order.append([operSetArray[0]])
} else if oper.count == 2 {
order = [[operSetArray[0],operSetArray[1]],[operSetArray[1],operSetArray[0]]]
}else{
order = [[operSetArray[0],operSetArray[1],operSetArray[2]],[operSetArray[0],operSetArray[2],operSetArray[1]],[operSetArray[1],operSetArray[0],operSetArray[2]],[operSetArray[1],operSetArray[2],operSetArray[0]],[operSetArray[2],operSetArray[1],operSetArray[0]],[operSetArray[2],operSetArray[0],operSetArray[1]]]
}
//์ฐ์ ์์์กฐํฉ์ ์์๋๋ก ๊บผ๋ผ for๋ฌธ
for c in order {
//์ฐ์ฐ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ซ์๋ค์ ๋๋ ์ ๋ด์์ค๋ค.
numbers = expression.components(separatedBy: CharacterSet(charactersIn: "*-+"))
//์ฐ์ฐ์๋ค๋ง ์๋ ๋ฐฐ์ด์ ๋ค์ ๋ณต๊ตฌ
operArray = expression.filter({$0 == "+" || $0 == "-" || $0 == "*"}).map{String($0)}
var x = 1
//์ซ์๋ค๊ณผ ์ฐ์ฐ์๋ค์ ๊ฐ ์์น์ ๋ง๊ฒ ๋ฐฐ์ด๋ก ๋ง๋ค์ด์ค๋ค.
while x < numbers.count{
numbers.insert(operArray.first!, at: x)
if operArray.first! == "-"{
minus.append(x)
}else if operArray.first! == "+"{
plus.append(x)
}else {
multiple.append(x)
}
operArray.removeFirst()
x += 2
}
j = 0
//j๊ฐ ์ฐ์ฐ์์ ๊ฐฏ์๋ณด๋ค ์ ๋ค๋ฉด์ ์กฐ๊ฑด์ผ๋ก while๋ฌธ์ ๋๋ฆผ
while j < c.count {
//detectMMP์ +,-,* ์ธ์ง ๋ฃ์ด์ค
detectMMP(c.map({$0})[j])
}
//๋ง์ง๋ง์ผ๋ก ๋จ์ numbers์ ์ ๋๊ฐ์ ๊ฐ์ ์ ์ฅํ๋ sums์ ๋ฃ์ด์ค
sums.append(abs(Int64(numbers.first!)!))
}
//sums์ ์๋ ์ ์ผ ํฐ ์๋ฅผ returnํด์ค๋ค.
return sums.max()!
}
func detectMMP(_ oper:String){
var mmpCopy = [Int]()
//๋ง์ฝ ์ฐ์ ์์์กฐํฉ์ค ์ฐจ๋ก๋ก ์ฐ์ฐ์๋ฅผ ์์๋ด๊ณ plus๋ฐฐ์ด์์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๊ณ numbers์์ ๊ทธ ๊ธฐํธ ์ ๋ค์ ์ซ์๋ค์ ๊ฐ ์ฐ์ฐ๊ธฐํธ์ ๋ง๊ฒ ํด์ค๋ค.
if oper == "+" {
mmpCopy = plus
numbers[plus.first! - 1] = "\(Int(numbers[plus.first! - 1])! + Int(numbers[plus.first! + 1])!)"
//์ฐ์ฐ์ด ๋๋๋ฉด ํด๋น ์ฐ์ฐ์๋ฅผ ๋ด๋ ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ์ญ์ ํด์ค๋ค.
plus.removeFirst()
//๋ง์ฝ ์ฐ์ฐ๊ธฐํธ๊ฐ ์ฌ๋ฌ๊ฐ์ผ๋ j๋ฅผ ๊ทธ๋๋ก ์ ์งํด ๋ค์ ๊ทธ ์ฐ์ฐ์๋ก ๋๋์์ค๊ฒํ๋ค.
if plus.isEmpty {
j += 1
}
}else if oper == "-" {
mmpCopy = minus
numbers[minus.first! - 1] = "\(Int(numbers[minus.first! - 1])! - Int(numbers[minus.first! + 1])!)"
minus.removeFirst()
if minus.isEmpty {
j += 1
}
}else if oper == "*"{
mmpCopy = multiple
numbers[multiple.first! - 1] = "\(Int(numbers[multiple.first! - 1])! * Int(numbers[multiple.first! + 1])!)"
multiple.removeFirst()
if multiple.isEmpty {
j += 1
}
}
//์์์ ์ญ์ ํด์ค ์ฐ์ฐ์์ ์์น๋ฅผ ์ญ์ ํด์ค๋ค. ํ๋ฒ ๋ ํด์ฃผ๋ ์ด์ ๋ ๋ ์ซ์๋ฅผ ์ฐ์ฐํ๋ฉด ์ฐ์ฐ์ ๋ค์ ์ซ์๊ฐ ์๋์ผ๋ก ์์ด์ง๊ธฐ ๋๋ฌธ์ด๋ค. //๊ทธ ๋ค์ ๊ฐ ์ฐ์ฐ์์ ์ธ๋ฑ์ค ์ค ์ ์ ์ญ์ ๋ ์ธ๋ฑ์ค๋ณด๋ค ํฐ ๊ฐ์ด๋ผ๋ฉด -2๋ฅผ ํด์ค๋ค. ์๋ํ๋ฉด ์ฐ์ฐ์์ ๋ ์ซ์๊ฐ ์ฐ์ฐ๋์ด ํ๋์ ์ซ์๊ฐ ๋๋ฏ๋ก 2๊ฐ์ ๊ฐ์ด ์ญ์ ๋๋ค.
plus = plus.filter{$0 <= mmpCopy.first!}.map{$0} + plus.filter{$0 > mmpCopy.first!}.map{$0-2}
multiple = multiple.filter{$0 <= mmpCopy.first!}.map{$0} + multiple.filter{$0 > mmpCopy.first!}.map{$0-2}
minus = minus.filter{$0 <= mmpCopy.first!}.map{$0} + minus.filter{$0 > mmpCopy.first!}.map{$0-2}
}
|
cs |
์๋กญ๊ฒ ์๊ฒ ๋๊ฒ๋ค
Set์ ๋ฐฐ์ด ์ ์ฒด๋ฅผ ๋ฃ๊ธฐ์ํด์ Set.formUnion(Array)
String์์ ์ฌ๋ฌ๊ฐ์ separator๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด String.components(separatedBy: CharacterSet(charactersIn: "์ํ๋๊ฒ๋ค"))
์ ๋๊ฐ์ ์์๋ด๊ธฐ ์ํด์ abs(Int64(Number))
'๐ Problem Solution > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก๊ทธ๋๋จธ์ค ์์ด ๋๋ง์๊ธฐ Swift (0) | 2020.09.24 |
---|---|
2019 ์นด์นด์ค ๊ฐ๋ฐ์ ๊ฒจ์ธ ์ธํด์ฝ ํํ Swift (0) | 2020.09.07 |
ํ๋ก๊ทธ๋๋จธ์ค ํ๊ฒ ๋๋ฒ Swift (0) | 2020.08.31 |
ํ๋ก๊ทธ๋๋จธ์ค ์ต์๊ฐ ๋ง๋ค๊ธฐ Swift (0) | 2020.08.28 |
ํ๋ก๊ทธ๋๋จธ์ค ์ต๋๊ฐ๊ณผ ์ต์๊ฐ (0) | 2020.08.28 |
๋๊ธ