[Programmers] 큰 수 만들기 (Python3)
문제
어떤 숫자에서 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”|
문제 풀이
풀고나니까 별로 안어려웠는데도 왜인지 발상이 너무 안 떠올라서 오래걸렸다. 생각하는걸 코드로 구현못하는건 그만큼 더 열심히 해야겠다고 생각하고 다음 문제를 풀게 되는데, 이렇게 발상 조차 안되서 코드 한줄도 못적고 노트에만 쓰고 있다보면 진짜 답답하고 나 자신한테 화가난다. 이번 문제도 그다지 어려운 알고리즘도 아닌데 도대체 왜 못떠올렸는지… 좀 패턴을 찾는 문제에 약한 것같다.
이 문제는 가장 큰 수를 만드는 문제이므로, 앞에서부터 리스트에 저장해가면서 만약 리스트의 가장 마지막 숫자가 다음 숫자보다 크다면 그 숫자를 바로 리스트에 추가하고, 다음 숫자보다 작다면 그 숫자보다 큰수가 나올때까지 리스트의 맨 마지막 값을 없애주고 다음 숫자를 추가하는 방식으로 가장 큰 수를 만들 수 있다.
또, 반드시 예외 처리를 해주어야하는데, 54321 처럼 내림차순의 모양을 띄는 숫자는 계속 리스트의 마지막 숫자가 다음숫자보다 크므로 삭제가 일어나지않기때문에, 가장 큰 수를 만드는 것은 뒤에서 부터 k만큼 삭제하는 것이므로, 따로 예외를 처리해주어 출력하도록 한다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def solution(number, k):
result = []
number = list(number)
remove=0
for num in number:
if not result:
result.append(num)
continue
while result and result[-1] < num:
if remove == k:
result.append(num)
break
result.pop()
remove+=1
else:
result.append(num)
if len(result) > len(number)-k:
return "".join(result[:len(number)-k])
return "".join(result)
1
solution("54321",2)
1
'543'
댓글남기기