본문 바로가기

Algorithm/코드 풀이

LeetCode: 65번 (Valid Number) [JAVA]

문제 링크

https://leetcode.com/problems/valid-number/

 

Valid Number - LeetCode

Can you solve this real interview question? Valid Number - A valid number can be split up into these components (in order): 1. A decimal number or an integer. 2. (Optional) An 'e' or 'E', followed by an integer. A decimal number can be split up into these

leetcode.com

풀이

전체적인 풀이 과정은 다음과 같다.

  1. 해당 조건을 만족하는 정규표현식을 생성 후, 주어지는 문자열과 매칭 결과를 반환

 문제 풀이를 위해 속도적인 측면을 고려했을 때 복잡한 조건문을 통해 문자열을 검증하는 것이 맞지만, 스터디에서 한 분이 정규표현식을 활용한 풀이를 보여줘 시도를 해본 문제이다. 결국 문제에서 요구하는 숫자의 정체는 e,E라는 지수 표현을 제외하면, 선택적 괄호 이후 크게 3가지이다. 첫 번째는 단순히 숫자만 오는 형태, 두 번째는 숫자와 점(.) 이후 선택적으로 숫자가 오는 형태, 마지막으로는 선택적으로 숫자가 오고 이후 점(.)이 오고 나서 숫자가 하나 이상 나오는 케이스다. 이를 정규표현식으로 나타내면

[-+]?([0-9]+(\\.[0-9]*)?|[0-9]*\\.[0-9]+)

 해당 형태가 된다. 이후 이제 선택적으로 지수인 e, E가 따라올 수 있고, 그 이후에 이제 숫자가 추가된다. 다만 이 경우엔 소수점이 오지 않기 때문에 단순히 선택적으로 괄호가 오고나서는 하나 이상의 숫자가 오면 된다.

"^[-+]?([0-9]+(\\.[0-9]*)?|[0-9]*\\.[0-9]+)([eE][-+]?[0-9]+)?$";//최종 정규표현식


 그렇게 정규표현식을 완성하고 나서는, 단순히 주어진 문자열 s를 해당 정규표현식과 비교한 결과를 반환해주면 된다.

 

class Solution {
    public boolean isNumber(String s) {
        String pattern = "^[-+]?([0-9]+(\\.[0-9]*)?|[0-9]*\\.[0-9]+)([eE][-+]?[0-9]+)?$";//정규표현식
        return Pattern.matches(pattern, s);
    }
}

결과