๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1918
ํ์ ํ๊ธฐ์, ๋์๊ฒ ๋ฏ์ค์์ง๋ง, ์ ํํ๋ ํ์ด๋ฐฉ๋ฒ์ด ์๋ค๊ณ ํ๋ค. ํ์ํ๊ธฐ์๊ณผ ๋น์ทํ ๋ชจ๋ ๋ฌธ์ ๋ ๋๋ถ๋ถ stack์ ์ด์ฉํด์ ํผ๋ค๊ณ ํ๋ค. ์ ์ตํ๋์.
๋ด๊ฐ ํผ ํ์ด
์ฐ์ ํ์ํ๊ธฐ์์ ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ํ์ด๋ณธ ์ ์ด ์์๊ธฐ์ ์ธํฐ๋ท์ ์ฐธ๊ณ ํ์ฌ ํ์ดํ๋ค. ๊ทธ๋์ ์ฝ๋๊ฐ ๊ฑฐ์ ๋น์ทํ๋ค (ํํ.. ์ธ์ ์ฏค ๋๋ ์ํ ์ ์์๊น)
์ ๋ ฅ๋ฐ๋ ํ๊ธฐ์์ line, ๋ต์์ผ๋ก ์ถ๋ ฅํ ๋ฐฐ์ด์ answer, ์ฐ์ฐ์๋ฅผ ์ ์ฅํด๋๊ณ ์ฐ์ ์์๋ฅผ ๊ณ ๋ คํด์ค ๋ฐฐ์ด์ stack์ผ๋ก ์ค์ ํ๊ณ , ์ด ์ธ๊ฐ์ ๋ณ์๋ฅผ ํ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํ์๋ค.
- line์ ๋งจ ์๋ถํฐ ์์๋๋ก ํ character์ฉ ํ์ ํด๋ณผ ๊ฒ์ด๋ค.
- ํผ์ฐ์ฐ์ (์ํ๋ฒณ)์ ๋ชจ๋ answer๋ก pushํด์ค๋ค.
- ํผ์ฐ์ฐ์๊ฐ ์๋๋ผ๋ฉด, ์ฐ์ ์์๋ฅผ ๊ณ ๋ คํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- ( ๋ผ๋ฉด, stack์ ๋ฃ์ด์ค๋ค.
- ) ๋ผ๋ฉด, ํ๋ฒ์ ๊ณ์ฐ์ด ๋๋๋ค๋ ๋ป์ด๊ธฐ ๋๋ฌธ์, )๋ฅผ ๋ง๋๋ค๋ฉด stack์ ๋ค์ด์๋ ๋ชจ๋ ์ฐ์ฐ์๋ฅผ popํ์ฌ answer๋ก pushํด์ค๋ค.
- ์ฐ์ฐ์๋ฅผ ๋ง๋๋ค๋ฉด, ์ฐ์ ์์๋ฅผ ๊ณ ๋ คํด์ผํ๋ค.
- ํ์ฌ ๋ง๋ ์ฐ์ฐ์์ ์ฐ์ ์์๊ฐ stack์ ์๋ ์ฐ์ ์์๋ณด๋ค ๋๋ค๋ฉด, ๊ทธ๋๋ก stack์ ๋ฃ์ด์ค๋ค. (stack์ ๋์ค์ ๋ฃ์ผ๋ฉด ๋จผ์ ์ถ๋ ฅ๋๊ธฐ ๋๋ฌธ์)
- ํ์ฌ ๋ง๋ ์ฐ์ฐ์์ ์ฐ์ ์์๊ฐ, stack ๋ง์ง๋ง์ ์๋ ์ฐ์ฐ์ ์ฐ์ ์์๋ณด๋ค ๋ฎ๋ค๋ฉด, stack์ ๋น์์ฃผ๊ณ ๋์ stack์ pushํด์ค๋ค. stack์ ๋น์์ค๋ค๋ ๊ฒ์, stack์ ์๋ ์ฐ์ฐ์๋ฅผ answer๋ก push ํด์ค๋ค๋ ์๋ฏธ์ด๋ค.
์ด ํ์ด๋ฐฉ๋ฒ์ ๊ทธ๋๋ก ์ฝ๋๋ก ๊ตฌํํ๋ฉด ์๋์ ๊ฐ๋ค.
var line = Array(readLine()!)
var answer: [Character] = []
var stack: [Character] = []
func getPriority(op: Character) -> Int{
switch op {
case "+":
return 1
case "-":
return 1
case "*":
return 2
case "/":
return 2
case "(":
return 0
default:
break
}
return 0
}
for op in line {
if op.isLetter { // op๊ฐ ABC..(ํผ์ฐ์ฐ์)์ด๋ฉด answer๋ก push
answer.append(op)
} else {
if op == "(" { // ( ์ด๋ฉด stack์ผ๋ก push
stack.append(op)
} else if op == ")" { // ) ์ด๋ฉด ์ฐ์ ์์๊ฐ ๋๋ฌ๋ค๋ ๋ป์ด๋ฏ๋ก, stack์ ์๋ ์ฐ์ฐ์๋ฅผ popํ์ฌ answer๋ก push
while true { // ๋ค ๊บผ๋ด์ผํ๋ฏ๋ก ๋ฐ๋ณต๋ฌธ ํ์ฉ
let data = stack.removeLast()
if data == "(" { break } // (๊ฐ ๋ํ๋๋ฉด answer์ ๋ฃ์ง ์์ผ๋ ค๊ณ break
answer.append(data!)
}
} else if stack.isEmpty || getPriority(op: op) > getPriority(op: stack.last!) {
// stack์ด ๋น์๊ฑฐ๋, ํ์ฌ op์์ฐ์ ์์๊ฐ ๋ ๋์ผ๋ฉด stack์ push
stack.append(op)
} else {
// stack์ ์ด๋ฏธ ์ฐ์ฐ์๋ค์ด ์กด์ฌํ๋ฉด์ ํ์ฌ op์ ์ฐ์ ์์๊ฐ ๋ฎ์๊ฒฝ์ฐ (+,- ์ธ๊ฒฝ์ฐ)
// stack์ ์๋ ๋ชจ๋ ์ฐ์ฐ์๋ฅผ answer๋ก pushํ ํ stack์ผ๋ก push ํด์ผํจ
while !stack.isEmpty {
let temp = stack.last!
if getPriority(op: temp) >= getPriority(op: op) {
let data = stack.removeLast()
answer.append(data)
} else {
break
}
}
stack.append(op)
}
}
}
// ์ ๋จ๊ณ๊ฐ ๋ชจ๋ ๋๋๋ฉด stack์ ์์ฌ์๋ ์ฐ์ฐ์๋ฅผ ํ๋์ฉ answer๋ก push
while !stack.isEmpty {
answer.append(stack.removeLast())
}
print(String(answer))
๋๋ ์ฝ๋ฉํ ์คํธ ์ํ๊ณ ์ถ๋ค. ์์ง ๊พธ์คํ ๊ณต๋ถํ์ง ํ๋ฌ ๋ ์ฑ ๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋ฌธ์ ์ ์ ํ์ด ์ ์ ํ ๊ฑฐ๊ฒ์ง? ์ฐจ์ฐจ ๋ด ์ค๋ ฅ์ด ๋์์ง๊ธธ ๋ฐ๋๋ค ใ ใ ๊พน์ฐธ๊ณ ๊ณต๋ถํ๋ฉด ์ธ์ ๊ฐ ๋์์ง๊ฒ์ง...
'Algorithm > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] (Swift) 10809๋ฒ - ์ํ๋ฒณ ์ฐพ๊ธฐ (0) | 2022.02.15 |
---|---|
[๋ฐฑ์ค] (Swift) 10808๋ฒ - ์ํ๋ฒณ ๊ฐ์ (0) | 2022.02.13 |
[๋ฐฑ์ค] (Swift) 1935๋ฒ - ํ์ ํ๊ธฐ์2 (0) | 2022.02.11 |
[๋ฐฑ์ค] (Swift) 17413๋ฒ - ๋จ์ด๋ค์ง๊ธฐ2 (0) | 2022.02.07 |
[๋ฐฑ์ค] (Swift) 10866๋ฒ - ๋ฑ(deque) (0) | 2022.02.06 |