오늘 푼 문제
https://school.programmers.co.kr/learn/courses/30/lessons/42883
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
import Foundation
func solution(_ number:String, _ k:Int) -> String {
var k = k
var stack = [Character]()
for num in number {
while !stack.isEmpty && k > 0 && stack.last! < num {
stack.removeLast()
k -= 1
}
stack.append(num)
}
while k > 0 {
stack.removeLast()
k -= 1
}
return String(stack)
}
문제의 목표는 주어진 숫자에서 k 개의 숫자를 제거했을 때 만들 수 있는 가장 큰 숫자를 구하는 것이다. 이를 해결하기 위해 스택을 적용할 수 있다.
스택: Last In, First Out 원칙을 따르는 자료구조.
숫자들을 임시로 저장하면서, 최종 결과(가장 큰 수들을 저장할 배열) 을 도출할 수 있다.
스택의 마지막 요소와 현재 숫자를 비교하는 것이 해당 문제의 핵심 솔루션이다.
현재 숫자가 스택의 마지막 요소보다 크고, k 가 0이 될 때까지 스택에서 요소를 제거한다. 이 과정에서 k 를 1씩 감소시키며, while 문으로 반복한다.
(가장 큰 숫자) 현재 숫자를 스택에 추가한다.
for num in number {
while !stack.isEmpty && k > 0 && stack.last! < num {
stack.removeLast()
k -= 1
}
stack.append(num)
}
모든 숫자를 순회한 후에도 k번의 제거 기회를 모두 사용하지 못한 경우(예: 모든 숫자가 같은 경우), 남은 제거 횟수만큼 스택의 마지막 요소부터 추가로 제거한다.
while k > 0 {
stack.removeLast()
k -= 1
}