ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Programmers] 큰 수 만들기 (Java, Stack)
    Algorithm 2023. 2. 2. 07:34
    728x90
    반응형

    - 목차

     

    문제 설명.

    https://school.programmers.co.kr/learn/courses/30/lessons/42883

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

     

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

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

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

    제한 조건

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

    입출력 예

    "1924" 2 "94"
    "1231234" 3 "3234"
    "4177252841" 4 "775841"

     

     

    문제 분석.

    긴 자리수를 가지는 숫자가 제공됩니다.

    예를 들면, 4177252841 이런 무작위한 패턴의 숫자가 제공됩니다.

    이 숫자를 첫번째 자리수의 숫자부터 N 개의 숫자를 선별적으로 제거하여 가장 큰 수를 만들어야합니다.

    만약 4177252841 숫자에서 4개의 개별 숫자를 제거하여 가장 큰 수를 만들기 위해서는

    4, 1, 2, 2 를 제거하여 775841 을 생성하는 것이 가장 큰 수를 만드는 방법입니다.

     

    이 과정에서 저는 Stack 을 사용하였구요.

    Stack 에 값을 채워나가면서 큰 숫자를 만나게되면 Stack 을 비우는 방식으로 진행합니다.

    4177252841

     

    < 1st >

    stack : 4

     

    < 2nd >

    stack : 4 1

     

    < 3rd >

    이 과정에서 가장 큰 숫자인 7 을 만나게되므로 Stack 을 Clear 합니다.

    stack : 7

     

    < 4th >

    stack : 7 7

     

    < 5th >

    stack : 7 7 2

     

    < 6th >

    이 과정에서 2가 Pop 되고 5가 push 됩니다.

    stack : 7 7 5

     

    < 7th >

    stack : 7 7 5 2

     

    < 8th >

    이 과정에서 2개 Pop 되고 8가 push 됩니다.

    stack : 7 7 5 8

     

    < 나머지 >

    stack : 7 7 5 8 4 1

     

    문제 풀이.

    import java.util.*;
    import java.math.BigInteger;
    
    class Solution {
      public String solution(String number, int k) {
        StringBuilder max = new StringBuilder();
        Stack<Integer> stack = new Stack<>();
    
        for (int i = 0; i < number.length(); i++) {
          Integer value = Integer.parseInt(number.substring(i, i + 1));
          if (i == 0) {
            stack.push(value);
            continue;
          }
    
          while (true) {
            if (k == 0) break;
            if (stack.isEmpty()) break;
            if (stack.peek() >= value) break;
            if (stack.peek() < value) {
              stack.pop();
              k--;
            }
          }
          stack.push(value);
        }
    
        if (k > 0) return number.substring(0, number.length() - k);
        while (!stack.isEmpty()) {
          max = max.insert(0, stack.pop());
        }
    
        return max.toString();
      }
    }

     

    반응형
Designed by Tistory.