본문 바로가기
Algorithm/Programmers

[Programmers] Lv.0 | 숨어있는 숫자의 덧셈 (2) | Java

by unknownomad 2025. 10. 1.

문제

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

 

풀이

import java.util.regex.*;

class Solution {
    public int solution(String my_string) {
        int sum = 0;
        
        Matcher matcher = Pattern.compile("\\d+").matcher(my_string);
        
        while (matcher.find()) {
            sum += Integer.parseInt(matcher.group());
        }
        
        return sum;
    }
}
class Solution {
    public int solution(String my_string) {
        int sum = 0;
        StringBuilder number = new StringBuilder();
        
        for (char ch : my_string.toCharArray()) {
            if (Character.isDigit(ch)) {
                number.append(ch); // 숫자면 이어붙이기
            } else {
                if (number.length() > 0) {
                    sum += Integer.parseInt(number.toString()); // 숫자 변환 후 더하기
                    number.setLength(0); // StringBuilder 초기화
                }
            }
        }
        
        // 마지막이 숫자로 끝날 경우
        if (number.length() > 0) {
            sum += Integer.parseInt(number.toString());
        }
        
        return sum;
    }
}

자주 쓰이는 정규식 패턴 정리

패턴  의미  예시 매칭
\d 숫자 1자리 (0~9) 1, 9, 3
\d+ 연속된 숫자 하나 이상 123, 42
\D 숫자가 아닌 문자 1개 a, @, Z
\w 알파벳 + 숫자 + _ a, 9, _
\W \w가 아닌 것 !, *, -
. 아무 문자 1개 (줄바꿈 제외) a, 1, #
[abc] a 또는 b 또는 c a, b, c
[^abc] a, b, c 제외한 문자 d, z
[a-z] 소문자 a~z b, m
[A-Z] 대문자 A~Z F, X
[0-9] 숫자 0~9 4, 7
* 0회 이상 반복 a* → "", a, aa, aaa
+ 1회 이상 반복 a+ → a, aa, aaa
? 0 또는 1회 a? → "", a
{n} n회 반복 a{3} → aaa
{n,} n회 이상 반복 a{2,} → aa, aaa, ...
{n,m} n~m회 반복 a{2,4} → aa, aaa, aaaa
^ 문자열 시작 ^abc → abc123, X: xabc
$ 문자열 끝 123$ → abc123, X: 123abc

 

숫자만 찾고 싶을 때 쓰는 정규식

정규식  설명
\d+ 숫자 1자리 이상 (자연수 찾기)
\d{1,3} 1~3자리 숫자
[1-9]\d* 선행 0 없는 자연수
[^0]\d* 첫 자리가 0이 아닌 숫자
  • 예시: "abc123def456"에서 숫자 추출
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("abc123def456");

while (matcher.find()) {
    System.out.println(matcher.group());  // 출력: 123, 456
}

 

 

실생활 예시

상황  정규식
이메일 검증 [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}
전화번호 \\d{3}-\\d{3,4}-\\d{4}
우편번호 (5자리) \\d{5}
소문자만 허용 ^[a-z]+$
영문자+숫자 조합 ^[a-zA-Z0-9]+$

 

  • Java에서는 백슬래시 \를 이스케이프해야 해서 \\d 이렇게 씀
  • 정규식은 한 번 익혀두면 문자열 처리에서 압도적인 효율을 줍니다.

댓글