πŸ’†πŸ»‍♂️ ν”Ό-μ—μŠ€/🐣 ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[μŠ€μœ„ν”„νŠΈ μ•Œκ³ λ¦¬μ¦˜] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€: 큰 수 λ§Œλ“€κΈ°

κ°œλ°œν•˜λŠ” ν›ˆμ΄ 2021. 8. 1. 00:18

문제

μ–΄λ–€ μˆ«μžμ—μ„œ k개의 수λ₯Ό μ œκ±°ν–ˆμ„ λ•Œ 얻을 수 μžˆλŠ” κ°€μž₯ 큰 숫자λ₯Ό κ΅¬ν•˜λ € ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, 숫자 1924μ—μ„œ 수 두 개λ₯Ό μ œκ±°ν•˜λ©΄ [19, 12, 14, 92, 94, 24] λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. 이 쀑 κ°€μž₯ 큰 μˆ«μžλŠ” 94 μž…λ‹ˆλ‹€.

λ¬Έμžμ—΄ ν˜•μ‹μœΌλ‘œ 숫자 number와 μ œκ±°ν•  수의 개수 kκ°€ solution ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€. numberμ—μ„œ k 개의 수λ₯Ό μ œκ±°ν–ˆμ„ λ•Œ λ§Œλ“€ 수 μžˆλŠ” 수 쀑 κ°€μž₯ 큰 숫자λ₯Ό λ¬Έμžμ—΄ ν˜•νƒœλ‘œ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜μ„Έμš”.

μ œν•œ 쑰건

  • numberλŠ” 1자리 이상, 1,000,000자리 μ΄ν•˜μΈ μˆ«μžμž…λ‹ˆλ‹€.
  • kλŠ” 1 이상 number의 자릿수 λ―Έλ§ŒμΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

풀이

κ·Έλ¦¬λ””ν•œ λ°©λ²•μœΌλ‘œ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•žμ—μ„œλΆ€ν„° μž‘μ€ 숫자λ₯Ό 주어진 개수만큼 μ§€μ›Œμ£Όλ©΄ 남은 μˆ«μžλ“€μ„ 합쳐 κ°€μž₯ 큰 숫자λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄μ„œ μŠ€νƒμ„ λ§Œλ“€μ–΄μ„œ μŠ€νƒμ˜ κ°€μž₯ μœ„μ— μžˆλŠ” 값보닀 큰 κ²½μš°μ—λ§Œ 집어넣고 μ§€μšΈ 수 μžˆλŠ” 숫자의 κ°œμˆ˜κ°€ 더 λ‚¨μ•˜λ‹€λ©΄ κ·Έ λ‹€μŒ μˆ«μžλΆ€ν„° 같은 μž‘μ—…μ„ λ°˜λ³΅ν•˜λ„λ‘ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

μ½”λ“œ

import Foundation
func solution(_ number:String, _ k:Int) -> String {
    var nums = Array(number)
    var stack : [Character] = []
    var eraseCount = 0
    
    while !nums.isEmpty && eraseCount != k {
        if !stack.isEmpty && !nums.isEmpty && nums.first! > stack.last! {
            while !stack.isEmpty && nums.first! > stack.last! {
                stack.popLast()
                eraseCount += 1
                if eraseCount == k {
                    break
                }
            }
            stack.append(nums.removeFirst())
        } else {
            stack.append(nums.removeFirst())
        }
    }
    
    while !nums.isEmpty {
        stack.append(nums.removeFirst())
    }
    
    while eraseCount != k {
        stack.popLast()
        eraseCount += 1
    }
    return String(stack)
}