프로그래머스 탐욕법(Greedy) 큰 수 만들기 [JAVA] - 22년 8월 31일

Denia·2022년 8월 31일
0

코딩테스트 준비

목록 보기
53/201
post-custom-banner

2시간 ~ 3시간 가까이 방법을 찾으려고 했지만 계속해서 실패했고, 결국엔 답안을 보고 풀이를 진행했다.
(※나도 완전탐색 + 스택 풀이 방법 [스택은 전혀 생각하지 못했고 저런식으로 풀어야지만 생각했음 ㅠㅠ] 과 비슷한 알고리즘으로 풀이를 진행하려고 했지만 예외케이스를 제대로 처리하지 못해서 답을 풀지 못했다.)

처음엔 상당히 쉽겠지 라고 생각하고 접근했는데 중간에 몇번 막히다보니 멘붕에 빠져서 풀지못했던 것 같다.

완전 탐색

참고 블로그 : https://cyk0825.tistory.com/35

package com.company;

// 출처 : https://cyk0825.tistory.com/35

class Solution {
    public String solution(String number, int k) {
        //문자열을 합해야 하므로 StringBuilder 사용
        StringBuilder sb = new StringBuilder();
        //시작 index를 저장하기 위해 변수 생성
        int startIndex = 0;

        /*
         * 주어진 숫자 n에서 k개의 숫자를 빼서 가장 큰 수를 만들어야함
         * number의 자릿 수 - k = 만들어야 하는 수의 길이
         *
         * 가장 큰 수의 첫번째 자리에 올 수 있는 수는 n에서 인덱스가 0~k까지
         * 두번째 자리에 올 수 있는 수는 n에서 인데스가 1~k+1에 해당하는 수
         * 세번째 자리에 올 수 있는 수는 n에서 인데스가 2~k+2에 해당하는 수 ...
         * 이런식으로 해당 자리에 오는 수 중 가장 큰 수를 하나씩 찾는데 그 전수 보다 앞자리에 올 수 는 없기 때문에
         * 마지막으로 찾은 자리 수의 인덱스 +1부터 자리에 올 수 있는 가장 마지막 수의 인덱스 까지 비교하며 찾는다.
        */

        //for문을 돌면서 확인을 해야함
        for (int i = 0; i < number.length() - k; i++) {
            int maxValue = Integer.MIN_VALUE;
            for (int j = startIndex; j <= i + k ; j++) {
                int tempChar = number.charAt(j) - '0';
                if(tempChar > maxValue){
                    maxValue = tempChar;
                    startIndex = j + 1;
                }
            }

            sb.append(maxValue);
        }

        return sb.toString();
    }
}

Stack 사용 - 시간 차이가 엄청나다.

import java.util.Stack;
class Solution {
    public String solution(String number, int k) {
        char[] result = new char[number.length() - k];
        Stack<Character> stack = new Stack<>();

        for (int i=0; i<number.length(); i++) {
            char c = number.charAt(i);
            while (!stack.isEmpty() && stack.peek() < c && k-- > 0) {
                stack.pop();
            }
            stack.push(c);
        }
        for (int i=0; i<result.length; i++) {
            result[i] = stack.get(i);
        }
        return new String(result);
    }
}

profile
HW -> FW -> Web
post-custom-banner

0개의 댓글