# 백준: 2812번 - 크게 만들기 swift

pengsang·2023년 7월 24일

문제풀이

목록 보기
10/11
post-thumbnail

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

문제 예시

1. 입력

4 2 // (입력문자길이) (제거되는 숫자의 개수)
1924 // (입력되는 숫자)

2. 출력

94 // 결과

3. 접근

[ . ][ . ][ . ][ . ] <- 1 삽입 예정 --> 그대로 삽입
[ 1 ][ . ][ . ][ . ] <- 9 삽입 예정 --> 들어갈 숫자(9) > stack의 top(1) 이므로 pop후 9 삽입
[ 9 ][ . ][ . ][ . ] <- 2 삽입 예정 --> 들어갈 숫자(2) < stack의 top(9) 이므로 그대로 2 삽입
[ 9 ][ 2 ][ . ][ . ] <- 4 삽입 예정 --> 들어갈 숫자(4) > stack의 top(2) 이므로 pop후 4 삽입
[ 9 ][ 4 ][ . ][ . ] -> 결과

4. 문제 발생

숫자가 11111 혹은 11110과 같이 모든 수가 동일하거나 마지막 숫자가 작은 경우 + 제거되어야할 숫자의 개수를 충족하지 못한경우
-> 그대로 출력하는 문제가 발생

5 2 // 입력
11111 // 입력
11111 // 출력
5 2 // 입력
11110 // 입력
11110 // 출력

그에 따라 제거되어야 하는 숫자가 충족될때까지 완성된 stack에서 숫자를 pop해야 한다


풀이과정

  1. 들어가게 될 숫자와 stack의 top을 비교한다

  2. stack의 top보다 들어갈 숫자가 더 클 경우 -> 들어갈 숫자보다 크거나 같은 숫자가 나올때까지 pop
    -> pop를 하면서 count를 센다

  3. 2번의 조건에 따라 모든 수를 넣었을 경우 count수가 제거해야하는 숫자의 수를 충족하지 못할 경우
    -> 부족한 횟수만큼 pop

var input = readLine()!.split(separator: " ").map{Int($0)!}
var str = Array(readLine()!).map{Int(String($0))!}
var stack = [Int]()
var count = 0

for i in str {
    while !stack.isEmpty && i > stack[stack.count - 1] && 0 < input[1] {
        stack.removeLast()
        input[1] -= 1
    }
    stack.append(i)
}

while 0 < input[1] {
    stack.removeLast()
    input[1] -= 1
}

for j in stack {
    print(j,terminator: "")
}

profile
내 꿈은 고등어

0개의 댓글