Skip to main content

58. [Java] 0 떼기

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

  • 정수로 이루어진 문자열 n_str이 주어질 때,
  • n_str의 가장 왼쪽에 처음으로 등장하는 0들을 뗀 문자열을 return

  • 2 ≤ n_str ≤ 10
  • n_str이 "0"으로만 이루어진 경우는 없다.

정답코드 (정규식)

class Solution {
    public String solution(String n_str) {
        // 시작부터 연속된 0제거하는 정규식
        return n_str.replaceFirst("^0+", ""); 
    }
}
String.replaceFirst();

자바의 String 클래스에서 제공하는 메서드로, 정규식에 일치하는 첫 번째 부분 문자열만 찾아서 바꾸는 기능이다.

String result = 원본문자열.replaceFirst("정규식", "바꿀문자열");
✅ 자주 쓰이는 정규식 패턴
  • ^ : 문자열의 시작 위치
  • + : 앞 문자가 1번 이상 반복
  • * : 앞 문자가 0번 이상 반복
  • [a-z] : 소문자 알파벳 하나
  • \\d : 숫자 (0\~9) 하나
  • . : 아무 문자 하나 (줄바꿈 제외)

예제1_ 왼쪽의 0 제거

String input = "00012345";
String result = input.replaceFirst("^0+", ""); // 시작(^) 위치의 0이 하나 이상(+) 반복되는 부분 제거
System.out.println(result); // 출력: 12345

예제2_ 가장 앞의 알파벳만 제거

String input = "abc123abc";
String result = input.replaceFirst("^[a-zA-Z]", "");
System.out.println(result); // 출력: bc123abc (첫 번째 알파벳만 제거됨)

예제3_ - 문자들 제거

String input = "---Hello-World";
String result = input.replaceFirst("^-+", ""); // 문자열 시작에서 연속된 - 제거
System.out.println(result); // 출력: Hello-World

정답코드 (substring)

class Solution {
    public String solution(String str) {
        // 앞쪽의 '0'을 제거하고 싶을 때
        char ch = '0'; 
        int idx = 0;

        // 문자열 앞에서부터 ch와 같은 문자가 연속되면 인덱스를 증가하는 로직
        // idx 인덱스가 문자열의 길이보다 작고,d idx 위치의 문자가 ch(0)이면
        // 인덱스 증가
        while (idx < str.length() && str.charAt(idx) == ch) {
            idx++;
        }

        // ch가 반복된 앞부분을 잘라낸 나머지를 반환
        return str.substring(idx);
    }
}
  1. 문자열의 맨 앞부터 검사 시작
  2. ch 와 같은 문자(0 이면 idx++
  3. ch 가 아닌 문자가 처음 등장하면 루프 종료
  4. 그 인덱스부터 끝까지 substring 으로 자르기

여기서 중요한 부분은 이 코드이다.

str.charAt(idx) == ch

이 말은 현재 위치의 문자가 ch 일때만 idx++를 계속 한다는 뜻이다.
즉, 문자가 ch 가 아니면 이 조건이 false가 되고, 그 순간 while문이 종료된다.

참고로 양쪽 자르기도 함께 알아보자. 오른쪽 0은 어떻게 제거하는지 궁금하기 때문이다.

public String trimZeros(String str) {
    int start = 0;
    int end = str.length();

    // 왼쪽 0 제거
    while (start < end && str.charAt(start) == '0') {
        start++;
    }

    // 오른쪽 0 제거
    while (end > start && str.charAt(end - 1) == '0') {
        end--;
    }

    return str.substring(start, end);
}