코딩테스트 연습 - 큰 수 만들기
programmers.co.kr
문제 설명
어떤 숫자에서 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" |
문제 풀이
프로그래머스 기준 LEVEL 2 난이도의 문제이다.
처음 문제를 보고 combinations로 가능한 조합 중 제일 큰 걸 찾으려고 했지만 시간 초과로 실패했다. 제한 조건에 number의 크기가 최대 1,000,000자리라고 하니 당연한 결과일 것이다.
그다음에는 number[i]가 number[i+1]보다 작으면 삭제하는 방식으로 접근했는데... 1924 같은 케이스에서는 문제없지만 당장 4177272841에서는 5가 지워지는 등 문제가 많았다.
그래서 여러 블로그 포스트에서 참고해가며 스택을 이용하면 쉽게 풀린다는 걸 알아냈다.
다음은 전체 코드이다:
def solution(number, k):
stack = [number[0]]
for num in number[1:]:
while stack and stack[-1] < num and k > 0:
stack.pop()
k -= 1
stack.append(num)
return "".join(stack) if k == 0 else "".join(stack[:-k])
스택이 비어있지 않고, 스택의 마지막 아이템이 현재 들어오는 숫자보다 작다면 계속해서 지워주는 방법이다. 다만, number = 10000, k = 2 같은 경우는 계속해서 들어오는 0이 stack[-1]와 같기 때문에 아무 숫자도 지워지지 않는다.
따라서 마지막에 k가 0이 아닐 경우를 대비해 stack에서 k만큼 자른 값을 반환하면 된다.
'Algorithms > 프로그래머스 (Programmers)' 카테고리의 다른 글
[프로그래머스] 로또의 최고 순위와 최저 순위 (Python) (0) | 2022.03.28 |
---|---|
[프로그래머스] 신고 결과 받기 (Python) (0) | 2022.03.27 |
[프로그래머스] 야근 지수 (Python) (0) | 2022.03.25 |
[프로그래머스] 주식가격 (Python) (0) | 2022.03.25 |
[프로그래머스] 베스트앨범 (Python) (0) | 2022.03.25 |