티스토리 뷰

Algorithm/Solution

[프로그래머스] - 큰 수 만들기

기내식은수박바 2020. 3. 9. 23:41
반응형

문제 설명

  • 어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.
  • 예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다.
    • 이 중 가장 큰 숫자는 94 입니다.
  • 문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다.
    • number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.

 

제한 조건

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

 

입출력 예

 

솔루션

  • 스택을 사용했으며, 수행 과정을 간략히 소개하면 아래와 같다.
    • 스택이 비어있다면, 숫자를 스택에 삽입한다.
    • 스택이 비어있지 않다면, 스택의 꼭대기에 있는 숫자와 현재 숫자를 비교한다.
      • 스택 꼭대기에 있는 숫자더 크거나 동일하다면, 스택에 현재 숫자를 삽입한다.
      • 스택 꼭대기에 있는 숫자가 현재 숫자보다 작다면, 아래 조건들이 참인 동안 스택에 있는 숫자들을 빼고 지워야 하는 숫자 개수를 1 감소시킨다.
        • 지워야 하는 숫자 개수 (k)1개라도 있는지
        • 스택에 아직 데이터가 들어있는지 (스택이 비어있지 않은지)
        • 스택 꼭대기 숫자가 현재 숫자보다 작은지
      • 위 조건들 중 하나가 어긋나고 반복 수행을 빠져나온 뒤에는 해당 숫자를 스택에 삽입한다.
  • 만약 위 과정을 모두 수행했는데 스택 크기가 우리가 원하는 숫자 개수보다 많다면 개수만큼만 잘라야 한다. (예시 3)
  • 그림을 통해 확인해보자.

예시 1 : 1924

예시 2 : 4177252841

예시 3 : 987654

  • 스택에 6개가 들어있지만, 우리는 총 숫자길이 6 - 2 (지워야 하는 숫자 개수 k) = 4개로 구성된 숫자를 얻어야 한다.
    • 따라서, 스택에서 숫자를 모두 뽑은 뒤 (4 5 6 7 8 9 순으로 뽑힐 것이다), 이를 뒤집는다 (9 8 7 6 5 4).
      • 뒤집는 이유는 스택의 특징인 FILO 때문에 먼저 들어간 제일 큰 숫자가 맨 마지막에 나오기 때문이다.
    • 스택에서 뽑은 모든 숫자들에 대해 위에서 구한 4개 만큼만 자른다 (파란색)

 

Code

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
27
public static String solution(String number, int k) {
    Stack<Character> stack = new Stack<>();
    int n = number.length() - k;
 
    for (int i = 0; i < number.length(); i++) {
        if (stack.isEmpty())
            stack.push(number.charAt(i));
        else {
            if (stack.peek() >= number.charAt(i))
                stack.push(number.charAt(i));
            else {
                while (k > 0 && !stack.isEmpty() && stack.peek() < number.charAt(i)) {
                    stack.pop();
                    k--;
                }
                stack.push(number.charAt(i));
            }
        }
    }
 
    StringBuilder sb = new StringBuilder();
 
    while(!stack.isEmpty())
        sb.append(stack.pop());
 
    return sb.reverse().substring(0, n).toString();
}
cs

 

결과

반응형

'Algorithm > Solution' 카테고리의 다른 글

[백준 1976] - 여행 가자  (0) 2020.03.11
[백준 5719] - 거의 최단 경로  (0) 2020.03.10
[백준 1261] - 알고스팟  (0) 2020.03.09
[백준 3055] - 탈출  (0) 2020.03.08
[백준 2146] - 다리 만들기  (0) 2020.03.07
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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 27 28 29 30 31
글 보관함