문제 설명
어떤 숫자에서 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 |