๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
3๏ธโƒฃ Swift/Problem Solving

[Swift Algorithm] ์˜ฅ์ƒ ์ •์› ๊พธ๋ฏธ๊ธฐ BOJ #6198

by seolhee2750 2021. 8. 6.
๋ฌธ์ œ ์„ค๋ช…

๋„์‹œ์—๋Š” N๊ฐœ์˜ ๋นŒ๋”ฉ์ด ์žˆ๋‹ค.

๋นŒ๋”ฉ ๊ด€๋ฆฌ์ธ๋“ค์€ ๋งค์šฐ ์„ฑ์‹ค ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ ์ •์›์„ ๋ฒค์น˜๋งˆํ‚น ํ•˜๊ณ  ์‹ถ์–ดํ•œ๋‹ค.

i๋ฒˆ์งธ ๋นŒ๋”ฉ์˜ ํ‚ค๊ฐ€ hi์ด๊ณ , ๋ชจ๋“  ๋นŒ๋”ฉ์€ ์ผ๋ ฌ๋กœ ์„œ ์žˆ๊ณ  ์˜ค๋ฅธ์ชฝ์œผ๋กœ๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

i๋ฒˆ์งธ ๋นŒ๋”ฉ ๊ด€๋ฆฌ์ธ์ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ ์ •์›์€ i+1, i+2, .... , N์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ž์‹ ์ด ์œ„์น˜ํ•œ ๋นŒ๋”ฉ๋ณด๋‹ค ๋†’๊ฑฐ๋‚˜ ๊ฐ™์€ ๋นŒ๋”ฉ์ด ์žˆ์œผ๋ฉด ๊ทธ ๋‹ค์Œ์— ์žˆ๋Š” ๋ชจ๋“  ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์€ ๋ณด์ง€ ๋ชปํ•œ๋‹ค.

์˜ˆ) N=6, H = {10, 3, 7, 4, 12, 2}์ธ ๊ฒฝ์šฐ

  • 1๋ฒˆ ๊ด€๋ฆฌ์ธ์€ 2, 3, 4๋ฒˆ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 2๋ฒˆ ๊ด€๋ฆฌ์ธ์€ ๋‹ค๋ฅธ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค.
  • 3๋ฒˆ ๊ด€๋ฆฌ์ธ์€ 4๋ฒˆ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 4๋ฒˆ ๊ด€๋ฆฌ์ธ์€ ๋‹ค๋ฅธ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค.
  • 5๋ฒˆ ๊ด€๋ฆฌ์ธ์€ 6๋ฒˆ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 6๋ฒˆ ๊ด€๋ฆฌ์ธ์€ ๋งˆ์ง€๋ง‰์ด๋ฏ€๋กœ ๋‹ค๋ฅธ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค.

๋”ฐ๋ผ์„œ, ๊ด€๋ฆฌ์ธ๋“ค์ด ์˜ฅ์ƒ์ •์›์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ด ์ˆ˜๋Š” 3 + 0 + 1 + 0 + 1 + 0 = 5์ด๋‹ค.

 

์ž…๋ ฅ
  • ์ฒซ ๋ฒˆ์งธ ์ค„์— ๋นŒ๋”ฉ์˜ ๊ฐœ์ˆ˜ N์ด ์ž…๋ ฅ๋œ๋‹ค.(1 ≤ N ≤ 80,000)
  • ๋‘ ๋ฒˆ์งธ ์ค„ ๋ถ€ํ„ฐ N+1๋ฒˆ์งธ ์ค„๊นŒ์ง€ ๊ฐ ๋นŒ๋”ฉ์˜ ๋†’์ด๊ฐ€ hi ์ž…๋ ฅ๋œ๋‹ค. (1 ≤ hi ≤ 1,000,000,000)

 

์ถœ๋ ฅ
  • ๊ฐ ๊ด€๋ฆฌ์ธ๋“ค์ด ๋ฒค์น˜๋งˆํ‚น์ด ๊ฐ€๋Šฅํ•œ ๋นŒ๋”ฉ์˜ ์ˆ˜์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ์ œ

์ž…๋ ฅ

6
10
3
7
4
12
2

์ถœ๋ ฅ

5

 

๋‚ด ๋ฌธ์ œ ํ’€์ด
import Foundation

let count = Int(readLine()!)!
var result = 0
var stack = [Int]()

for i in 0..<count {
    let h = Int(readLine()!)!
    
    // ์Šคํƒ์ด ๋น„์—ˆ์„ ๋•Œ (๊ฐ€์žฅ ์ฒซ ์˜ฅ์ƒ ๋†’์ด ์‚ฝ์ž…์„ ์œ„ํ•จ)
    if stack.isEmpty {
        stack.append(h)
    }
    // ์Šคํƒ์ด ๋น„์–ด์žˆ์ง€ ์•Š์„ ๋•Œ
    else {
        // ๋งŒ์•ฝ ์Šคํƒ์˜ ๋งˆ์ง€๋ง‰ ์˜ฅ์ƒ ๋†’์ด๊ฐ€ ํ˜„์žฌ ์ž…๋ ฅ๋œ ๋†’์ด๋ณด๋‹ค ๋†’์„ ๋•Œ
        if stack[stack.count-1] > h {
            stack.append(h)
        }
        // ๋งŒ์•ฝ ์Šคํƒ์˜ ๋งˆ์ง€๋ง‰ ์˜ฅ์ƒ ๋†’์ด๊ฐ€ ํ˜„์žฌ ์ž…๋ ฅ๋œ ๋†’์ด๋ณด๋‹ค ๋‚ฎ์„ ๋•Œ
        else {
            while stack[stack.count-1] <= h {
                stack.removeLast()
                result += stack.count
                if stack.isEmpty { break }
            }
            stack.append(h)
        }
    }
    
    // ๋งˆ์ง€๋ง‰ ์ˆ˜๊ฐ€ ์ž…๋ ฅ, ์œ„์˜ ๊ณผ์ •์„ ๊ฑฐ์น˜๊ณ ๋„ stack์˜ ๊ธธ์ด๊ฐ€ 1 ์ด์ƒ์ผ ๊ฒฝ์šฐ
    if i == count-1 && stack.count > 1 {
        for _ in 0..<stack.count-1 {
            stack.removeLast()
            result += stack.count
        }
    }
}

print(result)

(์ด ๋ฌธ์ œ๋Š” #2493๋ฒˆ ํƒ‘ ๋ฌธ์ œ์™€ ์ •๋ง ์œ ์‚ฌํ•˜๋ฏ€๋กœ, ํ•จ๊ป˜ ํ’€์–ด๋ณด์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.)

ํ’€์ด๋ฅผ ๋‚˜์—ดํ•˜๊ธฐ ์ „, ๋‚ด๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ๋ณด๋Š” ์‹œ์„ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ๋‹ค.
ํ•ด๋‹น ๋ฌธ์ œ ์„ค๋ช…์—์„œ๋Š” ํ•œ ์˜ฅ์ƒ์ด ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ์˜ฅ์ƒ์˜ ์ˆ˜๋“ค์˜ ํ•ฉ์„ ๊ตฌํ•˜๋ผ ํ•˜์˜€์ง€๋งŒ,
๋‚˜๋Š” ํ•œ ์˜ฅ์ƒ๋งˆ๋‹ค ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋‹ค๋ฅธ ์˜ฅ์ƒ๋“ค์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์—ญ์œผ๋กœ ํ’€์ดํ–ˆ๋‹ค.

  • ๋งจ ์ฒ˜์Œ ์ž…๋ ฅ๋˜๋Š” ์˜ฅ์ƒ ๋†’์ด์˜ ์Šคํƒ push๋ฅผ ์œ„ํ•ด isEmpty๋ฅผ ์ด์šฉํ•ด์ฃผ์—ˆ๋‹ค.
  • ๋‘ ๋ฒˆ์งธ ์ž…๋ ฅ๋˜๋Š” ์˜ฅ์ƒ๋ถ€ํ„ฐ๋Š” ์Šคํƒ์— ์กด์žฌํ•˜๋Š” ๋งˆ์ง€๋ง‰ ์š”์†Œ์™€ ๋†’์ด๋ฅผ ๋น„๊ตํ–ˆ๋‹ค.
  • ํ˜„ ์˜ฅ์ƒ์ด ์Šคํƒ์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ณด๋‹ค ๋‚ฎ๋‹ค๋Š” ๊ฒƒ
    == ์Šคํƒ ๋งˆ์ง€๋ง‰ ์š”์†Œ์— ํ•ด๋‹นํ•˜๋Š” ์˜ฅ์ƒ์˜ ์•ž์„ ๊ฐ€๋ฆฌ์ง€ ์•Š์Œ.
    && ์ด ์˜ฅ์ƒ ๋˜ํ•œ ์•ž์œผ๋กœ ์ž…๋ ฅ๋  ์˜ฅ์ƒ ์ค‘ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ์˜ฅ์ƒ ์กด์žฌ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ.
    ๋”ฐ๋ผ์„œ, ์ด ๋•Œ๋Š” result์— ๊ฐœ์ˆ˜๋ฅผ ๋ˆ„์ ํ•˜์ง€ ์•Š๊ณ  ์Šคํƒ์— ํ•ด๋‹น ์˜ฅ์ƒ์˜ ๋†’์ด๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ๋งŒ ํ•œ๋‹ค.
  • ํ˜„ ์˜ฅ์ƒ์ด ์Šคํƒ์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ณด๋‹ค ๋†’๋‹ค๋Š” ๊ฒƒ
    == ์ด ์˜ฅ์ƒ์ด ์Šคํƒ ๋งˆ์ง€๋ง‰ ์š”์†Œ ์˜ฅ์ƒ์˜ ์•ž์„ ๊ฐ€๋ฆผ.
    && ์ด ์˜ฅ์ƒ์€ ์•ž์œผ๋กœ ์ž…๋ ฅ๋  ์˜ฅ์ƒ ์ค‘ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ์˜ฅ์ƒ ์กด์žฌ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ.
    ๋”ฐ๋ผ์„œ, ์ด ๋•Œ๋Š” ์Šคํƒ์— ์ž…๋ ฅ๋˜์–ด์žˆ๋Š” ์˜ฅ์ƒ ์ค‘ ๋”์ด์ƒ ์ƒˆ๋กœ์šด ์˜ฅ์ƒ ๊ด€์ฐฐ์ด ๋ถˆ๊ฐ€ํ•œ ์˜ฅ์ƒ๋“ค์„ ์‚ญ์ œํ•˜๊ณ ,
    ์‚ญ์ œ๋˜๋Š” ์˜ฅ์ƒ๋“ค์€ ์ž๊ธฐ ์ž์‹ ์„ ๊ด€์ฐฐํ•œ ์˜ฅ์ƒ์ด ๋ช‡๊ฐœ์ธ์ง€ ์„ธ์–ด์ฃผ๋Š” ์—ญํ• ์˜ ๋ฐ˜๋ณต๋ฌธ์„ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.
  • ๋ฐ˜๋ณต๋ฌธ์€ ์Šคํƒ์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ ์˜ฅ์ƒ์ด ํ˜„ ์ž…๋ ฅ ์˜ฅ์ƒ๋ณด๋‹ค ๋‚ฎ์€๋™์•ˆ ์‹œํ–‰ํ•˜๊ฒŒ ํ–ˆ๊ณ ,
    removeLast๋ฅผ ์ด์šฉํ•˜์—ฌ ์Šคํƒ์˜ ๋งˆ์ง€๋ง‰ ์˜ฅ์ƒ์„ ํ•˜๋‚˜์”ฉ ์‚ญ์ œํ–ˆ๋‹ค.
  • result์—๋Š” ์‚ญ์ œ๋œ ์˜ฅ์ƒ์„ ๊ด€์ฐฐํ•œ ์˜ฅ์ƒ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ˆ„์ ํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ,
    ๋”ฐ๋ผ์„œ ํ•ด๋‹น ์˜ฅ์ƒ์„ ์‚ญ์ œํ•˜๊ณ  ๋‚จ์€ ์Šคํƒ์˜ ์˜ฅ์ƒ ๊ฐœ์ˆ˜๋ฅผ result์— ๋”ํ•ด์ฃผ์—ˆ๋‹ค.
    (ํ•ด๋‹น ์˜ฅ์ƒ๋ณด๋‹ค ๋‚ฎ๊ฑฐ๋‚˜ ์ค‘๊ฐ„์— ๊ฐ€๋ ค์ ธ ๊ด€์ฐฐํ•˜์ง€ ๋ชปํ•œ ์˜ฅ์ƒ์€ ์ด๋ฏธ ์Šคํƒ์—์„œ ์‚ญ์ œ๋๊ธฐ ๋•Œ๋ฌธ.)
  • ๊ทธ๋ฆฌ๊ณ  ํ˜„ ์ž…๋ ฅ ์˜ฅ์ƒ์ด ์˜ฅ์ƒ ์ค‘ ๊ฐ€์žฅ ๋†’์€ ์˜ฅ์ƒ์ผ ๊ฒฝ์šฐ, ์Šคํƒ์˜ ์˜ฅ์ƒ์„ ๋ชจ๋‘ ์‚ญ์ œํ•ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
    ์Šคํƒ์ด ๋น„๊ฒŒ ๋  ๊ฒฝ์šฐ ๋ฐ˜๋ณต๋ฌธ์„ ํƒˆ์ถœํ•˜๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.
  • ๋ฐ˜๋ณต๋ฌธ์ด ๋๋‚˜๋ฉด ์Šคํƒ์— ํ˜„ ์˜ฅ์ƒ ๋†’์ด๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰ ์˜ฅ์ƒ์ด ์ž…๋ ฅ๋œ ๊ฒฝ์šฐ์—๋Š”, ์Šคํƒ์˜ ๊ธธ์ด๋ฅผ ํ™•์ธํ•ด์ฃผ์–ด 1๋ณด๋‹ค ํด ๊ฒฝ์šฐ
    ์Šคํƒ ๊ธธ์ด๋งŒํผ ์œ„ while๋ฌธ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์˜ ๋ฐ˜๋ณต๋ฌธ์„ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๋‹ค.
    (๋งˆ์ง€๋ง‰ ์˜ฅ์ƒ์ด ์ž…๋ ฅ๋˜๊ณ , ์—ฐ์‚ฐ์„ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ–ˆ๋Š”๋ฐ๋„ ์Šคํƒ์˜ ๊ธธ์ด๊ฐ€ 1๋ณด๋‹ค ํฌ๋‹ค๋Š” ๊ฒƒ์€
    ํ˜„์žฌ ์Šคํƒ์— ๋‚จ์€ ์˜ฅ์ƒ๋“ค์˜ ๊ด€์ฐฐ ๊ฐœ์ˆ˜๊ฐ€ ์ธก์ •๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ.
    ex) ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ ๋งˆ์ง€๋ง‰์— [12, 2] ์Šคํƒ์ด ๋‚จ๊ฒŒ๋œ๋‹ค.
    2๋Š” 12๋ณด๋‹ค ์ž‘๊ธฐ๋•Œ๋ฌธ์— ์Šคํƒ์— ์ถ”๊ฐ€๋งŒ๋˜๊ณ  ๊ฒฐ๊ณผ์— ๋ˆ„์ ๋˜์ง€์•Š๋Š”๋‹ค.)

 

๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ
  • ๋ฐ”๋กœ ์ด์ „์— ํ’€์—ˆ๋˜ ๋ฌธ์ œ์™€ ๋„ˆ๋ฌด ๋น„์Šทํ•˜์—ฌ ๊ธˆ๋ฐฉ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ์ด๋Ÿฐ ํ’€์ด ๋ฐฉ๋ฒ•์„ ๋ณต์Šตํ•˜๊ฒŒ ๋๊ณ , ํ™•์‹คํžˆ ์ดํ•ดํ•˜๊ฒŒ๋˜์–ด ์•ž์œผ๋กœ๋„ ํ™œ์šฉ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™๋‹ค.
  • ๊ฒฐ๊ณผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ์‹œ๊ฐ„์ด ๋งŽ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋‚˜์™€์„œ,, ์ฝ”๋“œ ๊ฐœ์„ ์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 


 

 

๋ฌธ์ œ

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

๋Œ“๊ธ€