문제 풀이

107. 큰 수 만들기

zhelddustmq 2024. 8. 5. 19:08

문제 설명

어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.

예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.

문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.

제한 조건
  • number는 2자리 이상, 1,000,000자리 이하인 숫자입니다.
  • k는 1 이상 number의 자릿수 미만인 자연수입니다.
입출력 예
number k return
"1924" 2 "94"
"1231234" 3 "3234"
"4177252841" 4 "775841"

정답 코드:

# 단순히 combinations 했는데 역시나 시간초과
# from itertools import combinations


# def solution(number, k):
#     number = list(number)
#     max_num = 0
#     for combination in combinations(number, len(number) - k):
#         temp = int(''.join(list(combination)))
#         max_num = max(max_num, temp)
#     return str(max_num)

# 분할 정복과 비슷하게 해야함.
# k만큼 삭제할 거라 구간을 k만큼 잡아서 조사
def solution(number, k):
    count = 0 # 제거하고 남은 큰 수들의 갯수
    temp = set(number)
    # 확인할 필요도 없다면
    if len(temp) == 1:
        if number[0] == '0':
            return '0'
        number = number[:-k]
        return number
    answer = ''
    index = 0 # 확인할 다음 순서
    while k != 0:
        pre_index = index # 전 인덱스
        max_num = '/' # 아스키 코드 값이 '0'보다 작은 문자
        # 구간 내에 가장 큰 수 찾기
        for i in range(index, index + k + 1):
            # 범위 벗어나면
            if i >= len(number):
                break

            if max_num < number[i]:
                max_num = number[i]
                index = i
                if max_num == '9':
                    break

        answer += number[index]
        k -= index - pre_index
        index += 1
        if k == 0:
            answer += number[index:]
        # 끝까지 조사했는데도 삭제해야하는 갯수가 남으면 내림차순으로 되어있기 때문에 뒤에서 k만큼 삭제해주면 됨
        if index >= len(number) and k != 0:
            answer = answer[:-k]
            k = 0


    return str(int(answer))

'문제 풀이' 카테고리의 다른 글

109. 연속된 부분 수열의 합  (0) 2024.08.07
108. 삼각 달팽이  (0) 2024.08.06
105. 쿼드압축 후 개수 세기  (0) 2024.08.01
103. 가장 큰 수  (0) 2024.07.30
99. 롤케이크 자르기  (0) 2024.07.24