Judge

Programmers - 큰 수 만들기

깡구_ 2022. 6. 24. 11:23

title: Programmers - 큰 수 만들기
date: 2022-06-23
tags:

  • Algorithm




https://programmers.co.kr/learn/courses/30/lessons/42883


문제 요약

주어진 문자열 형식의 숫자에서 k개의 문자를 제거하여 만들 수 있는 가장 큰 숫자를 문자열로 return한다.


문제 풀이

문자열의 길이는 1M까지 되므로 1s 기준에서는 O(nlogn)을 넘으면 안 된다.
하지만 문자열을 두 번 확인할 필요 없이 앞에서부터 확인하면 되는 문제이다.
지운 문자의 개수를 카운트하며 앞의 문자를 지웠을 때 훨씬 좋은 수가 되는지 확인한다.
9가 나올 경우 확인을 멈춰야 쓸모없이 탐색하는 시간이 매우 줄어든다.
문자를 다 지우지 않았는데 loop가 끝나면 일정 위치부터는 내림차순으로 되어있으므로 뒤에서부터 지운다.
문자를 다 지우고 loop가 끝나면 확인하지 않은 남은 문자들을 문자열에 추가하면 된다.


프로그램

#include <string>

using std :: string ;

string solution ( string number , int k )
{
    string answer = "" ;
    int iCnt = 0 ;
    int iIndex = 0 ;
    int iTargetIndex = 0 ;
    int iLen = number.size () ;
    const char * cpTemp = number.data () ;



    while ( ( iCnt < k ) && ( iIndex < iLen ) )
    {
        if ( '9' == cpTemp [ iIndex ] )                    // Biggest, don't check
        {
            answer += cpTemp [ iIndex ++ ] ;
            continue ;
        }

        iTargetIndex = iIndex ;
        for ( int i = iIndex + 1 ; ( i <= iIndex + k - iCnt ) && ( i < iLen ) ; ++i )
        {
            if ( cpTemp [ iTargetIndex ] < cpTemp [ i ] )
            {
                iTargetIndex = i ;

                if ( '9' == cpTemp [ iTargetIndex ] )    // If find 9, then don't need to check other numbers
                    break ;
            }
        }

        if ( iIndex != iTargetIndex )                    // erase iIndex to iTargetIndex - 1
        {
            iCnt += iTargetIndex - iIndex ;
            iIndex = iTargetIndex ;

            answer += cpTemp [ iIndex ++ ] ;

            continue ;
        }

        // iIndex == iTargetIndex
        answer += cpTemp [ iIndex ++ ] ;
    }

    if ( iCnt < k )                                        // If append too many number, then erase the rest
        answer = answer.substr ( 0 , iLen - k ) ;
    else                                                // Erased, so append the rest
    {
        for ( int i = iIndex ; i < iLen ; ++i )
        {
            answer += cpTemp [ i ] ;
        }
    }

    return answer ;
}