Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 1918๋ฒˆ - ํ›„์œ„ํ‘œ๊ธฐ์‹

๊ฐ์ž ๐Ÿฅ” 2022. 2. 13. 16:18
๋ฐ˜์‘ํ˜•

 

๋ฌธ์ œ ๋งํฌ

https://www.acmicpc.net/problem/1918

 

1918๋ฒˆ: ํ›„์œ„ ํ‘œ๊ธฐ์‹

์ฒซ์งธ ์ค„์— ์ค‘์œ„ ํ‘œ๊ธฐ์‹์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹จ ์ด ์ˆ˜์‹์˜ ํ”ผ์—ฐ์‚ฐ์ž๋Š” ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ ์ˆ˜์‹์—์„œ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋“ฑ์žฅํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  -A+B์™€ ๊ฐ™์ด -๊ฐ€ ๊ฐ€์žฅ ์•ž์— ์˜ค๊ฑฐ๋‚˜ AB์™€ ๊ฐ™์ด *๊ฐ€ ์ƒ๋žต๋˜๋Š” ๋“ฑ์˜

www.acmicpc.net

 

ํ›„์œ„ ํ‘œ๊ธฐ์‹, ๋‚˜์—๊ฒ ๋‚ฏ์„ค์—ˆ์ง€๋งŒ, ์ •ํ˜•ํ™”๋œ ํ’€์ด๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ํ›„์œ„ํ‘œ๊ธฐ์‹๊ณผ ๋น„์Šทํ•œ ๋ชจ๋“ ๋ฌธ์ œ๋Š” ๋Œ€๋ถ€๋ถ„ stack์„ ์ด์šฉํ•ด์„œ ํ‘ผ๋‹ค๊ณ ํ•œ๋‹ค. ์ž˜ ์ตํ˜€๋‘์ž.

 

๋‚ด๊ฐ€ ํ‘ผ ํ’€์ด

์šฐ์„  ํ›„์œ„ํ‘œ๊ธฐ์‹์— ๋Œ€ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ’€์–ด๋ณธ ์ ์ด ์—†์—ˆ๊ธฐ์— ์ธํ„ฐ๋„ท์„ ์ฐธ๊ณ ํ•˜์—ฌ ํ’€์ดํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฝ”๋“œ๊ฐ€ ๊ฑฐ์˜ ๋น„์Šทํ•˜๋‹ค (ํ—ˆํ—ˆ.. ์–ธ์ œ์ฏค ๋‚˜๋„ ์ž˜ํ•  ์ˆ˜ ์žˆ์„๊นŒ)

์ž…๋ ฅ๋ฐ›๋Š” ํ‘œ๊ธฐ์‹์„ line, ๋‹ต์•ˆ์œผ๋กœ ์ถœ๋ ฅํ•  ๋ฐฐ์—ด์„ answer, ์—ฐ์‚ฐ์ž๋ฅผ ์ €์žฅํ•ด๋‘๊ณ  ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ณ ๋ คํ•ด์ค„ ๋ฐฐ์—ด์„ stack์œผ๋กœ ์„ค์ •ํ•˜๊ณ , ์ด ์„ธ๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค.

  • line์˜ ๋งจ ์•ž๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ํ•œ character์”ฉ ํŒŒ์•…ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค.
  • ํ”ผ์—ฐ์‚ฐ์ž (์•ŒํŒŒ๋ฒณ)์€ ๋ชจ๋‘ answer๋กœ pushํ•ด์ค€๋‹ค.
  • ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ณ ๋ คํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
    • ( ๋ผ๋ฉด, stack์— ๋„ฃ์–ด์ค€๋‹ค.
    • ) ๋ผ๋ฉด, ํ•œ๋ฒˆ์˜ ๊ณ„์‚ฐ์ด ๋๋‚œ๋‹ค๋Š” ๋œป์ด๊ธฐ ๋•Œ๋ฌธ์—, )๋ฅผ ๋งŒ๋‚œ๋‹ค๋ฉด stack์— ๋“ค์–ด์žˆ๋Š” ๋ชจ๋“  ์—ฐ์‚ฐ์ž๋ฅผ popํ•˜์—ฌ answer๋กœ pushํ•ด์ค€๋‹ค.
    • ์—ฐ์‚ฐ์ž๋ฅผ ๋งŒ๋‚œ๋‹ค๋ฉด, ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค.
      1. ํ˜„์žฌ ๋งŒ๋‚œ ์—ฐ์‚ฐ์ž์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ stack์— ์žˆ๋Š” ์šฐ์„ ์ˆœ์œ„๋ณด๋‹ค ๋†’๋‹ค๋ฉด, ๊ทธ๋Œ€๋กœ stack์— ๋„ฃ์–ด์ค€๋‹ค. (stack์€ ๋‚˜์ค‘์— ๋„ฃ์œผ๋ฉด ๋จผ์ € ์ถœ๋ ฅ๋˜๊ธฐ ๋•Œ๋ฌธ์—)
      2. ํ˜„์žฌ ๋งŒ๋‚œ ์—ฐ์‚ฐ์ž์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€, 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))

 

๋‚˜๋„ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ž˜ํ•˜๊ณ ์‹ถ๋‹ค. ์•„์ง ๊พธ์ค€ํžˆ ๊ณต๋ถ€ํ•œ์ง€ ํ•œ๋‹ฌ ๋„ ์ฑ„ ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋ฌธ์ œ์˜ ์œ ํ˜•์ด ์‹ ์„ ํ•œ ๊ฑฐ๊ฒŸ์ง€? ์ฐจ์ฐจ ๋‚ด ์‹ค๋ ฅ์ด ๋‚˜์•„์ง€๊ธธ ๋ฐ”๋ž€๋‹ค ใ… ใ…  ๊พน์ฐธ๊ณ  ๊ณต๋ถ€ํ•˜๋ฉด ์–ธ์  ๊ฐ„ ๋‚˜์•„์ง€๊ฒŸ์ง€...

๋ฐ˜์‘ํ˜•