본문 바로가기

Java/코딩테스트

[프로그래머스/181847] 0 떼기 (w. 정규표현식, String.replaceFirst())

✏️ 문제 설명

정수로 이루어진 문자열 n_str이 주어질 때, n_str의 가장 왼쪽에 처음으로 등장하는 0들을 뗀 문자열을 return하도록 solution 함수를 완성해 주세요.


✏️ code

💻 정규표현식 문법

  • 기본 특수 문자
기호 의미 예제 설명
. 임의의 한 문자 a.b a, 어떤 문자 1개, b
^ 문자열의 시작 ^abc abc로 시작하는 문자열
$ 문자열의 끝 xyz$ xyz로 끝나는 문자열
* 앞 문자가 0번 이상 반복 b*
(b가 아예 없을 수도, 있을 수도 있음)
abc => ' '(매칭됨)
bbabc => bb
abbbc => bbb
b => b
ac => ' '(매칭됨)
+ 앞 문자가 1번 이상 반복 b+
(b가 최소 1번 이상 있어야 함)
abc => 매칭되지 않음
bbabc => bb
abbbc => bbb
b => b
ac => 매칭되지 않음
? 앞 문자가 0번 또는 1번 등장 a? a 또는 없는 경우
[] 문자 클래스: 괄호 안의 문자 중 하나와 매칭 [abc] a, b, c 중 하나
| OR 조건 a|b a 또는 b
() 그룹화 (abc) abc를 하나의 그룹으로 간주
  • 특수 문자(Escape 문자 필요: \)
문자 설명
\d 숫자 ([0-9])
\D 숫자가 아닌 것 ([^0-9])
\w 단어 문자 ([a-zA-Z0-9_])
\W 단어 문자가 아닌 것
\s 공백 문자
\S 공백 문자가 아닌 것

 

💻 주요 클래스 및 메서드

  • java.util.regex 패키지를 통해 정규표현식을 지원하며, 주요 클래스 및 메서드는 다음과 같습니다.
  • Pattern: 정규표현식을 정의하는 클래스. 정규식 패턴을 컴파일하고 Matcher 객체를 생성합니다.
  • Matcher: Pattern 객체를 기반으로 실제 문자열과 정규식을 매칭하는 역할을 합니다.
주요 메서드 설명
Pattern 클래스 메서드  
Pattern.compile(String regex) 주어진 정규식을 컴파일하여 Pattern 객체를 반환합니다.
Pattern.matcher(CharSequence input) 주어진 문자열과 정규식을 매칭하기 위한 Matcher 객체를 반환합니다.
Pattern.matches(String regex, CharSequence input) 문자열이 정규식과 완전히 일치하는지 확인합니다. (단순 매칭 검사)
Pattern.split(CharSequence input) 정규식을 기준으로 문자열을 분리하여 배열로 반환합니다.
Matcher 클래스 메서드  
boolean matches() 전체 문자열이 패턴과 일치하는지 확인합니다.
boolean find() 패턴과 일치하는 부분 문자열이 있는지 확인합니다. 여러 번 호출하면 다음 매칭으로 이동합니다.
int start() 마지막으로 매칭된 문자열의 시작 인덱스를 반환합니다.
int end() 마지막으로 매칭된 문자열의 끝 인덱스를 반환합니다.
String group() 마지막으로 매칭된 문자열을 반환합니다.
String replaceAll(String replacement) 패턴에 매칭된 모든 부분 문자열을 주어진 문자열로 치환합니다.
String replaceFirst(String replacement) 패턴에 매칭된 첫 번째 문자열을 주어진 문자열로 치환합니다.
int groupCount() 그룹화된 캡처 그룹의 개수를 반환합니다.
String 클래스 메서드  
String.replaceFirst(String regex, String replacement) 정규식에 매칭되는 첫 번째 부분 문자열을 치환합니다.
String.replaceAll(String regex, String replacement) 정규식에 매칭되는 모든 부분 문자열을 치환합니다.
String.matches(String regex) 전체 문자열이 정규식과 일치하는지 확인합니다.
String.split(String regex) 정규식을 기준으로 문자열을 분리하여 배열을 반환합니다.
// 기본 매칭
import java.util.regex.*;

public class Main {
    public static void main(String[] args) {
        String input = "hello123world";
        String regex = "\\d+"; // 숫자 하나 이상

        // 패턴 생성 및 매칭
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);

        while (matcher.find()) {
            System.out.println("Matched: " + matcher.group()); // 숫자 출력
        }
    }
}

// 치환
public class Main {
    public static void main(String[] args) {
        String input = "hello 123 world 456";
        String regex = "\\d+"; // 숫자

        // replaceAll 사용
        String replaced = input.replaceAll(regex, "#");
        System.out.println(replaced); // "hello # world #"
    }
}

// 문자열 분리
public class Main {
    public static void main(String[] args) {
        String input = "apple,banana,grape";
        String[] fruits = input.split(",");

        for (String fruit : fruits) {
            System.out.println(fruit);
        }
    }
}

 


📌 고민했던 부분

  • n_str.replaceFirst("^0+", "");
    • ^0+: 0으로 시작하는 게 한 번 이상
    • replaceFirst: 정규식에 매칭되는 첫 번째 부분 문자열을 치환
// 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/181847?language=java
// 시간: 0.07 ms
// 메모리: 80.3 KB

package programmers;

public class P181847 {
    public String solution(String n_str) {
        return n_str.replaceFirst("^0+", "");
    }
}

 

반응형