Coding Test Study/Programmers

[Java] k 자리 제거하기

똑똑한망치 2024. 3. 22. 16:14
728x90
반응형

🎈 문제

양의 정수가 담긴 문자열 s 가 있다고 하자. 이 문자열에서 k 개의 숫자를 제거해, 가장 작은 숫자를 만들고자 한다.

이렇게 만든 가장 작은 숫자를 담은 문자열을 출력하시오.

단, k 개의 문자열을 제거한 결과는 앞에 불필요한 0 이 포함될 수 있으며, 최종 출력에는 이 불필요한 0은 제거하여 출력하시오.

 

🎈 입력 설명

  • 0 < s.length <= 10000
  • 0 < k <= s.length

 

🎈 출력 설명

가장 작은 숫자를 문자열로 반환

 

🎈 입력 예시

s = "105990"

k = 1

 

🎈 출력 예시

"5990"

 

🎈입출력 설명

맨 앞의 '1' 을 제거하면 "05990"이 된다. 불필요한 '0'을 제거한 최종 출력은 "5990" 이다.

 

 

🎈 코드 구현

  • 재귀 형태로 구현
    • 주어진 k 만큼 문자를 모두 제거했다면 (k==0 이라면) 리딩 제거를 제거한 후 반환
  • 제거할 자릿수 (k)가 문자열의 길이와 같거나 클 때 "0" 반환
  • 우선순위
    • 문자열에서 2번째 자리에 0이 있다면 문자 한개를 지움으로써 2개를 지우는 효과 발생하기 때문에 우선순위가 제일 높다
    • 자릿수가 높고 숫자가 큰 숫자를 우선적으로 삭제

 

class Solution {
    public String solution(String s, int k) {

        // 제거할 자릿수가 입력된 문자열의 길이보다 클 때
        // 이때는 0을 반환
        if (k >= s.length()) {
            return "0";
        }

        // 주어진 k만큼 문자를 모두 제거했다면
        if (k == 0) {
            return removeLeadingZero(s);
        }

        char[] chars = s.toCharArray();

        // 2번째 자리가 '0' 이라면 숫자 하나를 지워도 2개를 지우는 효과가 있다.
        // 따라서 다른 숫자를 지우는 것 보다 우선순위가 높다.
        if(chars[1] == '0') {
            return solution(removeLeadingZero(s.substring(1)),k-1);
        } else {
            int idx  = 0;

            // 높은 자릿수부터 탐색 시작, 숫자가 감소하면 멈춤
            // 숫자가 같다면 큰 자릿수 숫자 삭제
            for (int i = 1; i < chars.length ; i++) {
                if(chars[i-1] < chars[i]) {
                    idx = i;
                } else if (chars[i-1] != chars[i]) {
                    break;
                }
            }

            return solution(
                    s.substring(0,idx) + s.substring(idx+1),
                    k-1
            );
        }
    }

    // Leading Zero를 삭제하고 문자열을 반환하는 메서드
    String removeLeadingZero(String s) {
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(c != '0') {
                return s.substring(i);
            }
        }
        return "0";
    }
}
반응형

'Coding Test Study > Programmers' 카테고리의 다른 글

마을 판사 찾기  (0) 2024.07.31
[Java] 난이도 - 중 / DP 문제  (0) 2024.03.22
[Java] 선을 넘나드는 사각형  (1) 2024.03.22
[Java] 미로 탈출  (0) 2024.02.25
[Java] 카지노 교환원  (3) 2024.02.25