[์ค์ํํธ ์๊ณ ๋ฆฌ์ฆ] ํ๋ก๊ทธ๋๋จธ์ค: ์์์ต๋ํ
๋ฌธ์
https://programmers.co.kr/learn/courses/30/lessons/67257
๋ฌธ์ ์ค๋ช
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))
}
์ฝ๋
'๐๐ปโโ๏ธ ํผ-์์ค > ๐ฃ ํ๋ก๊ทธ๋๋จธ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote