[프로그래머스] 코딩테스트 풀이 - 큰 수 만들기

Reference : 프로그래머스 코딩 테스트 연습

문제 설명

어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.

예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.

문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.

제한 조건

  • number는 1자리 이상, 1,000,000자리 이하인 숫자입니다.
  • k는 1 이상 number의 자릿수 미만인 자연수입니다.

입출력 예

name k return
“1924” 2 “94”
“1231234” 3 “3234”
“4177252841” 4 “775841”

조건 분석

  • 나와야 하는 결과

    1
    만들 수 있는 숫자 중 가장 큰 숫자의 [문자열]
  • 문제를 풀기위해 주어진 데이터

    1
    2
    3
    4
    5
    6
    7
    # 문제 해결에 필요한 데이터

    1. name 문자열
    2. 문자열에서 제거할 숫자의 갯수

    # 제한조건
    - 앞에서 뒤로 제거하는 방식
  • 간단 알고리즘

    1
    2
    3
    4
    1. 만들 문자열 길이(전체길이 - k) 만큼의 배열리스트 내에서 최대값을 찾는다.
    2. answer에 최대값을 저장하고 최대값과 그 이전의 값들을 다 없앤다.
    3. 만들 문자열 길이 -1 을 하고 다시 리스트 내에서 최대값을 찾는다.
    4. 만들 문자열 길이가 0이면 반환한다.

나의 풀이

사용언어 : Python 3

위와 같은 알고리즘으로 답은 나왔으나 테스트케이스 중 시간초과로 해결하지 못한 케이스가 있었다.
찾아보니 스택으로 처리해야 한다는데 생각보다 간단해서 김이 빠졌다.

1
2
3
4
5
6
7
8
9
10
11
12
13
def solution(number, k):
collected = []
for i, num in enumerate(number):
while len(collected) > 0 and collected[-1] < num and k > 0:
collected.pop()
k -= 1
if k == 0:
collected += list(number[i:])
break
collected.append(num)
collected = collected[:-k] if k > 0 else collected

return ''.join(collected)

풀고 난 이후에 다른 사람들의 풀이를 봐도 매번 최대값을 찾는 풀이는 없었고 모두 스택으로 해결한것 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 알고리즘

1. numbers 의 값들을 순회한다.
1. 스택에 값이 있는지 확인한다.
T : 제일 위 스택이 현재값보다 작은지 확인한다
T : k값이 0보다 큰지 확인한다.
T : 스택의 값을 제거하고 k = k - 1 해준다.
2. k값이 0인지 확인한다.
T : 남은 number 리스트의 값들을 모두 뒤에 추가하고 break 한다
3. 현재값보다 스택이 큰지 확인한다.
T : 스택에 현재값을 넣는다

2. numbers 에서 k값이 0이 안됐을 경우 ([5,4,3,2,1] , [2])
T : 스택에서 뽑아야 할 문자열의 갯수만큼 뽑아낸다.
F : 스택 그대로 출력한다.

스택을 활용한 방법이 O(n)이라 매우 빠르다.

공유하기