문제 설명
어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.
예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.
문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.
제한 조건
- number는 1자리 이상, 1,000,000자리 이하인 숫자입니다.
- k는 1 이상 number의 자릿수 미만인 자연수입니다.
입출력 예
number | k | return |
"1924" | 2 | "94" |
"1231234" | 3 | "3234" |
"4177252841" | 4 | "775841" |
성공 코드
참고 코드: https://velog.io/@soo5717/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B0-%EC%88%98-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC
실패 코드: https://vg-rlo.tistory.com/95
실패 코드와 참고 코드를 따라가보면서 이해했습니다. 실패 코드에서 생각한 접근 방식이 맞았으나, 구현하는 방식을 stack으로 하지 않고, 슬라이싱을 하면서 런타임 에러가 발생했습니다. 그리고 비교하더라도 같은 숫자만 반복되는 경우에 대해 고려해주지 않았기 때문에 에러가 발생했는데 이 부분도 참고 코드를 통해 해결할 수 있었습니다.
def solution(number, k):
del_cnt = 0
biggest_num = []
for num in number:
# 가장 큰 수 리스트가 비어있는 경우
if len(biggest_num) == 0:
biggest_num.append(num)
# 가장 큰 수 리스트가 비어있지 않은 경우
else:
if del_cnt < k:
while True:
# 현재의 수가 앞자리 수보다 같거나 작으면 break
if num <= biggest_num[-1]:
break
# 앞자리 수를 제거
biggest_num.pop()
del_cnt += 1
# 가장 큰 수 리스트가 비어있거나 제거 횟수를 모두 채웠으면 break
if (len(biggest_num) == 0) or del_cnt == k:
break
biggest_num.append(num)
# 제거 횟수를 다 채우지 않은 경우 슬라이싱(테스트케이스 12번: 같은 숫자로 반복되는 경우)
biggest_num = biggest_num[:-k] if del_cnt < k else biggest_num
return ''.join(biggest_num)
실행시간
정확성 테스트
테스트 1 〉 | 통과 (0.01ms, 10.3MB) |
테스트 2 〉 | 통과 (0.01ms, 10.4MB) |
테스트 3 〉 | 통과 (0.04ms, 10.3MB) |
테스트 4 〉 | 통과 (0.21ms, 10.3MB) |
테스트 5 〉 | 통과 (0.22ms, 10.3MB) |
테스트 6 〉 | 통과 (3.75ms, 10.4MB) |
테스트 7 〉 | 통과 (9.59ms, 10.7MB) |
테스트 8 〉 | 통과 (23.08ms, 10.8MB) |
테스트 9 〉 | 통과 (39.35ms, 13.7MB) |
테스트 10 〉 | 통과 (133.79ms, 13.4MB) |
테스트 11 〉 | 통과 (0.01ms, 10.2MB) |
테스트 12 〉 | 통과 (0.01ms, 10.3MB) |