[프로그래머스] (LV2) 큰 수 만들기

[프로그래머스] (LV2) 큰 수 만들기

큰 수 만들기

JavaScript

문제 설명

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

출처



풀이


javascript

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
function solution(number, k) {

var nNumSize = number.length - k;

var arrRet = Array.from(Array(nNumSize),()=>null);
var nPos = 0;
var idx = 0;

while(nNumSize > 0){
var chMax = 0;

for(let i = nPos; i <= number.length - nNumSize; ++i){
if(number[i] > chMax){
chMax = number[i];
nPos = i;
if(chMax === "9")
break;
}
}
++nPos;
--nNumSize;
arrRet[idx++] = chMax;
}
return arrRet.join('');
}


python

1
2
3
4
5
6
7
8
9
def solution(number, k):
stack = []
n = len(number)
for i in range(n):
while stack and k > 0 and stack[-1] < number[i]:
stack.pop()
k -=1
stack.append(number[i])
return ''.join(stack[:n-k])



설명


탐욕법이 사용 가능하며, 어느정도 구현 능력을 요구하는 문제다.


언뜻 간단히 k * n의 풀이 시간이 필요한 것처럼 보이는데, 여기서 문자열을 다루는 함수를 사용시 이 추가되어 가 되버리고, 효율성 측면에서 풀이에 실패한다.


스택 자료구조를 이용해 탐욕법으로 풀이를 한다면 의 풀이가 가능하다(python 풀이). 0부터 number의 길이까지 반복문을 돌며 현재 스택의 마지막 값보다 값이 크면 스택에서 pop()을 반복적으로 수행한다. 이를 통해 스택에는 큰수부터 작은수대로 나열된다. 수의 크기를 결정짓는 부분은 앞쪽이므로 앞 숫자들을 최대화 하는 알고리즘이다.


스택이 아닌 인덱싱을 통해서도 풀이가 가능하다(javascript 풀이). 스택을 사용하지 않을 뿐, 값 비교와 인덱싱을 통해 결과를 저장하는 메커니즘은 동일하다.

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges


[프로그래머스] (LV2) 큰 수 만들기

https://sklubmk.github.io/2021/06/30/ce24844deb05/

Author

Jinki Kim

Posted on

2021-06-30

Updated on

2021-08-05

Licensed under

댓글