์•Œ๊ณ ๋ฆฌ์ฆ˜/์„ ํ˜•๊ตฌ์กฐ

[๋ฐฑ์ค€ 6198 ๐Ÿฅ‡] ์˜ฅ์ƒ ์ •์› ๊พธ๋ฏธ๊ธฐ

1eehyunji 2023. 10. 7. 19:13

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

 

6198๋ฒˆ: ์˜ฅ์ƒ ์ •์› ๊พธ๋ฏธ๊ธฐ

๋ฌธ์ œ ๋„์‹œ์—๋Š” N๊ฐœ์˜ ๋นŒ๋”ฉ์ด ์žˆ๋‹ค. ๋นŒ๋”ฉ ๊ด€๋ฆฌ์ธ๋“ค์€ ๋งค์šฐ ์„ฑ์‹ค ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ ์ •์›์„ ๋ฒค์น˜๋งˆํ‚น ํ•˜๊ณ  ์‹ถ์–ดํ•œ๋‹ค. i๋ฒˆ์งธ ๋นŒ๋”ฉ์˜ ํ‚ค๊ฐ€ hi์ด๊ณ , ๋ชจ๋“  ๋นŒ๋”ฉ์€ ์ผ๋ ฌ๋กœ ์„œ ์žˆ๊ณ  ์˜ค๋ฅธ์ชฝ์œผ

www.acmicpc.net

๋ฌธ์ œ

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

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

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

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

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

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

             = 
 =           = 
 =     -     = 
 =     =     =        -> ๊ด€๋ฆฌ์ธ์ด ๋ณด๋Š” ๋ฐฉํ–ฅ
 =  -  =  =  =   
 =  =  =  =  =  = 
10  3  7  4  12 2     -> ๋นŒ๋”ฉ์˜ ๋†’์ด
[1][2][3][4][5][6]    -> ๋นŒ๋”ฉ์˜ ๋ฒˆํ˜ธ
  • 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)

์ถœ๋ ฅ

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

๋ฌธ์ œ ํ’€์ด

  • ์ž์ฃผ ๋ดค๋˜ ์œ ํ˜•์˜ ๋ฌธ์ œ๋ผ ์ ‘๊ทผ์ด ์‰ฌ์› ๋‹ค!
  • ๊ฐ ๋นŒ๋”ฉ์˜ ๊ด€๋ฆฌ์ธ์ด ์˜ค๋ฅธ์ชฝ์— ์œ„์น˜ํ•œ ๋นŒ๋”ฉ๋“ค๋งŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋งจ ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ๋นŒ๋”ฉ๋ถ€ํ„ฐ for๋ฌธ์„ ์ด์šฉํ•ด์„œ ์ ‘๊ทผํ–ˆ๋‹ค.
  • ์ฒ˜์Œ์— ๋งจ ์˜ค๋ฅธ์ชฝ ๋นŒ๋”ฉ์˜ ๋†’์ด์™€ ๋ฒˆํ˜ธ๋ฅผ ์Šคํƒ์— ๋„ฃ์–ด๋‘”๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋กœ ์™ผ์ชฝ ๋นŒ๋”ฉ๋ถ€ํ„ฐ for๋ฌธ์„ ์ด์šฉํ•ด์„œ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค.
  • stack์˜ top์— ์œ„์น˜ํ•œ ๋นŒ๋”ฉ์ด ์ž์‹ ๋ณด๋‹ค ๋” ๋†’์€ ๋นŒ๋”ฉ์ด ๋  ๋•Œ๊นŒ์ง€ stack์„ popํ•˜๊ณ  popํ•œ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์–ด์ค€๋‹ค. 
  • ๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ popํ•œ ๋นŒ๋”ฉ ์ค‘ ํ•ด๋‹น ๋นŒ๋”ฉ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋นŒ๋”ฉ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•ด๋†“์€ ๋ฐฐ์—ด ans์˜ ๊ฐ’์ด 0๋ณด๋‹ค ํด ๊ฒฝ์šฐ ํ˜„์žฌ ๋นŒ๋”ฉ์—์„œ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด์ „ ๊ณ„์‚ฐ ๊ณผ์ •์—์„œ pop๋œ ๋นŒ๋”ฉ์ด ์กด์žฌํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ ํ•ด๋‹น ๋นŒ๋”ฉ์˜ ans ๊ฐ’์„ pop_number์— ์ถ”๊ฐ€๋กœ ๋”ํ•ด์ค€๋‹ค. 
  • ๊ทธ๋ฆฌ๊ณ  ์ž์‹ ๋ณด๋‹ค ์ž‘์€ ๊ฑด๋ฌผ์„ ๋ชจ๋‘ popํ•œ ๋’ค์—” ํ˜„์žฌ ๋นŒ๋”ฉ์˜ ๋†’์ด์™€ ๋ฒˆํ˜ธ๋ฅผ ์Šคํƒ์— ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. 
  • ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๊ฑฐ์ณ ans์— ์ €์žฅ๋œ ๊ฐ ๋นŒ๋”ฉ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋นŒ๋”ฉ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ชจ๋‘ ๋”ํ•ด์„œ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 
import sys
from collections import deque

n=int(sys.stdin.readline())
buildings=[int(sys.stdin.readline()) for _ in range(n)]

# ๊ฐ ๊ด€๋ฆฌ์ธ์ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋นŒ๋”ฉ์˜ ๊ฐœ์ˆ˜
ans=[0]*n

stack=deque()
stack.append((buildings[-1], n-1))
for i in range(n-2,-1,-1):
    # stack์˜ top๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ํ˜„์žฌ ๋นŒ๋”ฉ์˜ ์œ„์น˜๋ณด๋‹ค ์ž‘์€ ๋นŒ๋”ฉ popํ•˜๊ณ  ans ๋ฐฐ์—ด์— pop๋œ ๊ฐœ์ˆ˜๋งŒํผ ์ถ”๊ฐ€
    # ans ๋ฐฐ์—ด์— ํ•ด๋‹น ๋นŒ๋”ฉ์˜ ๋ฒˆํ˜ธ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, ํ•ด๋‹น ๋นŒ๋”ฉ๋ณด๋‹ค ์ž‘์•„์„œ pop๋œ ๊ฐœ์ˆ˜๋„ ์ถ”๊ฐ€ํ•ด์คŒ
    pop_number=0
    while stack and stack[-1][0]<buildings[i]:
        height, num=stack.pop()
        if ans[num]>0:
            pop_number+=ans[num]
        pop_number+=1
    ans[i]=pop_number
    # ์ž์‹ ๋ณด๋‹ค ์ž‘์€ ๊ฑด๋ฌผ ๋ชจ๋‘ popํ•œ ๋’ค์— ์ž์‹  ์ถ”๊ฐ€
    stack.append((buildings[i], i))

print(sum(ans))