Hanbit the Developer

[Python] 백준 2812번: 크게 만들기 본문

Algorithm/백준

[Python] 백준 2812번: 크게 만들기

hanbikan 2021. 5. 26. 17:11

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

 

2812번: 크게 만들기

N자리 숫자가 주어졌을 때, 여기서 숫자 K개를 지워서 얻을 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

 

import sys
input = sys.stdin.readline


# p 이전 숫자들 중에 -1이 아닌 것이 있다면 해당 인덱스를 받아옴
def getPreviousNumberIndex(p, numberList):
    p -= 1
    while p >= 0:
        if numberList[p] == -1:
            p -= 1
        else:
            return p

    return -1


def getRemovedMaxNumberList(numberList):
    kCount = 0
    p, n = 0, 1

    # 앞에서부터 숫자 비교하면서 삭제(= -1로 바꿈)
    while n <= N-1:
        if kCount >= K:
            return numberList

        if numberList[p] < numberList[n]:
            kCount += 1
            numberList[p] = -1

            previousNumberIndex = getPreviousNumberIndex(p, numberList)
            if previousNumberIndex != -1:
                p = previousNumberIndex
                continue

        p = n
        n += 1

    # 남은 것들이 있다면, 뒤에서 모두 처리(-1)
    for i in range(N-1, -1, -1):
        if kCount >= K:
            break

        if numberList[i] != -1:
            numberList[i] = -1
            kCount += 1

    return numberList


def solution(s):
    numberList = [int(c) for c in s]

    removedMaxNumberList = getRemovedMaxNumberList(numberList)
    for n in removedMaxNumberList:
        if n != -1:
            print(n, end="")


N, K = map(int, input().split())
s = str(input().rstrip())
solution(s)

 

getRemovedMaxNumberList()가 핵심이다. 우선 p, n은 비교 대상 둘의 인덱스다. 그리고 이후에 '삭제'의 의미는 해당 원소를 -1로 바꾸는 것을 뜻한다.

kCount를 증가시키면서 K와 같아질 때까지 원소들의 대소관계를 비교하면서 삭제해준다. 다만, 원소를 삭제했다면 p를 p 이전에 있는 -1이 아닌, 가장 가까운 숫자로 이동시킨다. 이 위치를 알기 위해 getPreviousNumberIndex()를 사용하는데, 만약 이 결과 값이 -1(p 이전의 모든 원소가 -1)일 경우는 걸러준다.

 

사진 한 장으로 요약하면 위와 같다. 빨간 밑줄은 각각 p, n을 뜻한다.

이렇게 비교 연산이 끝나고 kCount가 k까지 올라오면 바로 numberList를 리턴해준다.

 

하지만 kCount가 k를 만족하지 못하는 경우가 있다. 이 때는 단순히 뒤에 있는 숫자들을 계속해서 지워주면 된다.

 

이번 풀이는 다른 분들의 풀이와 비교하면, 심플하지 못하고 시간복잡도도 떨어진다. -1로 바꾸고, -1이 아닌 값까지 탐색을 하는 과정이 좋지 못하다. 데큐를 하나 만들고, 이 곳에 완성된 숫자들을 저장하는 용도로 바꾸면 훨씬 좋은 풀이가 만들어진다.

'Algorithm > 백준' 카테고리의 다른 글

[Python] 2012번: 등수 매기기  (0) 2021.05.28
[Python] 백준 1082번: 방 번호  (0) 2021.05.27
[Python] 백준 12970번: AB  (0) 2021.05.25
[Python] 백준 1080번: 행렬  (0) 2021.05.24
[Python] 백준 2138번: 전구와 스위치  (0) 2021.05.24