λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
3️⃣ Swift/Problem Solving

[Swift Algorithm] 탑 BOJ #2493

by seolhee2750 2021. 8. 4.
문제 μ„€λͺ…

KOI ν†΅μ‹ μ—°κ΅¬μ†ŒλŠ” λ ˆμ΄μ €λ₯Ό μ΄μš©ν•œ μƒˆλ‘œμš΄ λΉ„λ°€ 톡신 μ‹œμŠ€ν…œ κ°œλ°œμ„ μœ„ν•œ μ‹€ν—˜μ„ ν•˜κ³  μžˆλ‹€. μ‹€ν—˜μ„ μœ„ν•˜μ—¬ 일직선 μœ„μ— N개의 높이가 μ„œλ‘œ λ‹€λ₯Έ 탑을 μˆ˜ν‰ μ§μ„ μ˜ μ™Όμͺ½λΆ€ν„° 였λ₯Έμͺ½ λ°©ν–₯으둜 μ°¨λ‘€λ‘œ μ„Έμš°κ³ , 각 νƒ‘μ˜ κΌ­λŒ€κΈ°μ— λ ˆμ΄μ € 솑신기λ₯Ό μ„€μΉ˜ν•˜μ˜€λ‹€. λͺ¨λ“  νƒ‘μ˜ λ ˆμ΄μ € μ†‘μ‹ κΈ°λŠ” λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μ§€ν‘œλ©΄κ³Ό ν‰ν–‰ν•˜κ²Œ μˆ˜ν‰ μ§μ„ μ˜ μ™Όμͺ½ λ°©ν–₯으둜 λ°œμ‚¬ν•˜κ³ , νƒ‘μ˜ κΈ°λ‘₯ λͺ¨λ‘μ—λŠ” λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μˆ˜μ‹ ν•˜λŠ” μž₯μΉ˜κ°€ μ„€μΉ˜λ˜μ–΄ μžˆλ‹€. ν•˜λ‚˜μ˜ νƒ‘μ—μ„œ λ°œμ‚¬λœ λ ˆμ΄μ € μ‹ ν˜ΈλŠ” κ°€μž₯ λ¨Όμ € λ§Œλ‚˜λŠ” 단 ν•˜λ‚˜μ˜ νƒ‘μ—μ„œλ§Œ μˆ˜μ‹ μ΄ κ°€λŠ₯ν•˜λ‹€.

예λ₯Ό λ“€μ–΄ 높이가 6, 9, 5, 7, 4인 λ‹€μ„― 개의 탑이 μˆ˜ν‰ 직선에 일렬둜 μ„œ 있고, λͺ¨λ“  νƒ‘μ—μ„œλŠ” 주어진 탑 μˆœμ„œμ˜ λ°˜λŒ€ λ°©ν–₯(μ™Όμͺ½ λ°©ν–₯)으둜 λ™μ‹œμ— λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό λ°œμ‚¬ν•œλ‹€κ³  ν•˜μž. 그러면, 높이가 4인 λ‹€μ„― 번째 νƒ‘μ—μ„œ λ°œμ‚¬ν•œ λ ˆμ΄μ € μ‹ ν˜ΈλŠ” 높이가 7인 λ„€ 번째 탑이 μˆ˜μ‹ μ„ ν•˜κ³ , 높이가 7인 λ„€ 번째 νƒ‘μ˜ μ‹ ν˜ΈλŠ” 높이가 9인 두 번째 탑이, 높이가 5인 μ„Έ 번째 νƒ‘μ˜ μ‹ ν˜Έλ„ 높이가 9인 두 번째 탑이 μˆ˜μ‹ μ„ ν•œλ‹€. 높이가 9인 두 번째 탑과 높이가 6인 첫 번째 탑이 보낸 λ ˆμ΄μ € μ‹ ν˜ΈλŠ” μ–΄λ–€ νƒ‘μ—μ„œλ„ μˆ˜μ‹ μ„ ν•˜μ§€ λͺ»ν•œλ‹€.

νƒ‘λ“€μ˜ 개수 Nκ³Ό νƒ‘λ“€μ˜ 높이가 μ£Όμ–΄μ§ˆ λ•Œ, 각각의 νƒ‘μ—μ„œ λ°œμ‚¬ν•œ λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μ–΄λŠ νƒ‘μ—μ„œ μˆ˜μ‹ ν•˜λŠ”μ§€λ₯Ό μ•Œμ•„λ‚΄λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ. 

 

μž…λ ₯

첫째 쀄에 νƒ‘μ˜ 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ N이 주어진닀. N은 1 이상 500,000 μ΄ν•˜μ΄λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” N개의 νƒ‘λ“€μ˜ 높이가 직선상에 놓인 μˆœμ„œλŒ€λ‘œ ν•˜λ‚˜μ˜ λΉˆμΉΈμ„ 사이에 두고 주어진닀. νƒ‘λ“€μ˜ λ†’μ΄λŠ” 1 이상 100,000,000 μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€.

 

좜λ ₯

첫째 쀄에 주어진 νƒ‘λ“€μ˜ μˆœμ„œλŒ€λ‘œ 각각의 νƒ‘λ“€μ—μ„œ λ°œμ‚¬ν•œ λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μˆ˜μ‹ ν•œ νƒ‘λ“€μ˜ 번호λ₯Ό ν•˜λ‚˜μ˜ λΉˆμΉΈμ„ 사이에 두고 좜λ ₯ν•œλ‹€. λ§Œμ•½ λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μˆ˜μ‹ ν•˜λŠ” 탑이 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ 0을 좜λ ₯ν•œλ‹€.

 

μž…μΆœλ ₯ 예제

μž…λ ₯

5
6 9 5 7 4

좜λ ₯

0 0 2 2 4

 

(μœ„μ˜ 예제둜 νŒλ‹¨ν•˜κΈ° νž˜λ“  뢀뢄이 μžˆλ‹€κ³  μƒκ°λ˜μ–΄ μΆ”κ°€)

λ‚΄κ°€ λ§Œλ“  μž…λ ₯

4
9 3 2 8

λ‚΄κ°€ λ§Œλ“  좜λ ₯

0 1 2 1

 

λ‚΄ 문제 풀이
import Foundation

let count = Int(readLine()!)!
let top = readLine()!.components(separatedBy: " ").map{Int($0)!} // 탑 높이 μ €μž₯
var result = "0" // κ²°κ³Ό λˆ„μ 
var stack = [[0, top[0]]] // top의 인덱슀, 높이 값을 λ‹΄λŠ” 2차원 λ°°μ—΄

for i in 1..<count {
    if top[i-1] < top[i] {
        if stack[stack.count-1][1] < top[i] {
            while stack[stack.count-1][1] < top[i] {
                stack.removeLast()
                if stack.isEmpty { break }
            }
        }
        if stack.isEmpty {
            result.append(" 0")
        }
        else {
            result.append(" " + String(stack[stack.count-1][0] + 1))
        }
        stack.append([i, top[i]])
    }
    else {
        result.append(" " + String(stack[stack.count-1][0] + 1))
        stack.append([i, top[i]])
    }
}

print(result)

 μ΄ λ¬Έμ œλŠ” μ²˜μŒμ— 2쀑 for문을 μ‚¬μš©ν•˜μ—¬ μˆ«μžλ³„λ‘œ κ·Έ μ „κΉŒμ§€μ˜ 숫자 쀑

κ°€μž₯ κ°€κΉŒμš°λ©΄μ„œ 자기 μžμ‹ λ³΄λ‹€ 큰 숫자λ₯Ό μ°ΎλŠ” λ°©μ‹μœΌλ‘œ ν’€μ΄ν–ˆμ—ˆλ‹€.

ν•˜μ§€λ§Œ μ‹œκ°„μ΄ˆκ³Όκ°€ λ˜μ–΄ filter λ“± μŠ€μœ„ν”„νŠΈ ν•¨μˆ˜λ₯Ό 적극 ν™œμš©ν•˜μ—¬ ν‘ΈλŠ” 방법도 μ‹œλ„ν•΄λ΄€λŠ”λ°,

이 λ˜ν•œ μ‹œκ°„μ΄ˆκ³Όλ˜μ—ˆλ‹€.γ…œ λ”°λΌμ„œ μƒˆλ‘œ 생각해낸 방법을 μ•„λž˜ ν’€μ΄ν•˜κ² λ‹€.

 

[λ³€μˆ˜ μ„€λͺ…]

  • stackμ΄λΌλŠ” μ΄λ¦„μ˜ 2차원 λ°°μ—΄ 생성. μ΄λŠ” top의 인덱슀, 높이λ₯Ό 쌍으둜 λ°›μŒ.
  • 본격적인 μ—°μ‚° μ‹œμž‘ μ „, κ°€μž₯ 첫 번째 νƒ‘μ˜ μΈλ±μŠ€μ™€ 높이λ₯Ό λ¨Όμ € stack에 μ €μž₯,
    resultμ—λŠ” 0을 λ¨Όμ € μ €μž₯ν•΄μ£Όμ—ˆλ‹€. (μ–΄μ°¨ν”Ό 첫 번째 μΈλ±μŠ€λŠ” 보낼 수 μžˆλŠ” 탑이 μ—†κΈ° λ•Œλ¬Έ.) 

[풀이 둜직]

 

πŸ’‘ ν”Όλ“œλ°±
  • 였늘 ν•˜λ£¨μ’…μΌ λ”± 이 ν•œλ¬Έμ œμ— λ§€λ‹¬λ €μ„œ,, μ΄κ²ƒλ§Œ! ν’€μ—ˆλ‹€.γ…œ
  • μ²˜μŒμ— 봀을땐 정말 μ‰¬μ›Œλ³΄μ˜€λŠ”λ°, 막상 ν’€μ–΄λ³΄λ‹ˆ 정말 μ‹œκ°„ λ³΅μž‘λ„ λ§žμΆ”κΈ° λ„ˆλ¬΄λ„ˆλ¬΄ μ–΄λ €μš΄ λ¬Έμ œμ˜€λ‹€.
  • 였늘 푼것도 정말 겨우겨우 ν’€κ²Œλœ 것이기 λ•Œλ¬΄λ„€,, λ‹€μŒμ— κΌ­ λ‹€μ‹œ ν•œλ²ˆ 풀어보고 λ³΅μŠ΅ν•΄μ•Όκ² λ‹€.

 


 

문제

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

λŒ“κΈ€