[Programmers] 큰 수 만들기 (Python3)

1 분 소요

문제

어떤 숫자에서 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'

카테고리:

업데이트:

댓글남기기